grpc 1.60.2 → 1.61.0.pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +208 -165
- data/include/grpc/event_engine/event_engine.h +59 -12
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
- data/include/grpc/event_engine/internal/slice_cast.h +12 -0
- data/include/grpc/event_engine/memory_allocator.h +3 -1
- data/include/grpc/event_engine/slice.h +5 -0
- data/include/grpc/grpc_security.h +22 -1
- data/include/grpc/impl/call.h +29 -0
- data/include/grpc/impl/channel_arg_names.h +12 -1
- data/include/grpc/impl/slice_type.h +1 -1
- data/include/grpc/module.modulemap +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
- data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
- data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
- data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
- data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
- data/src/core/ext/filters/http/client_authority_filter.h +12 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
- data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
- data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
- data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
- data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
- data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
- data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
- data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
- data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
- data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
- data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
- data/src/core/ext/xds/certificate_provider_store.cc +2 -1
- data/src/core/ext/xds/certificate_provider_store.h +0 -5
- data/src/core/ext/xds/xds_api.cc +31 -18
- data/src/core/ext/xds/xds_api.h +2 -2
- data/src/core/ext/xds/xds_bootstrap.h +3 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
- data/src/core/ext/xds/xds_certificate_provider.h +44 -111
- data/src/core/ext/xds/xds_client.cc +420 -414
- data/src/core/ext/xds/xds_client.h +31 -22
- data/src/core/ext/xds/xds_client_grpc.cc +3 -1
- data/src/core/ext/xds/xds_cluster.cc +104 -11
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
- data/src/core/ext/xds/xds_common_types.cc +14 -10
- data/src/core/ext/xds/xds_endpoint.cc +9 -4
- data/src/core/ext/xds/xds_endpoint.h +5 -1
- data/src/core/ext/xds/xds_health_status.cc +12 -2
- data/src/core/ext/xds/xds_health_status.h +4 -2
- data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
- data/src/core/ext/xds/xds_listener.cc +14 -8
- data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
- data/src/core/ext/xds/xds_route_config.cc +34 -22
- data/src/core/ext/xds/xds_route_config.h +1 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
- data/src/core/ext/xds/xds_transport.h +3 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
- data/src/core/ext/xds/xds_transport_grpc.h +4 -0
- data/src/core/lib/channel/call_tracer.cc +12 -0
- data/src/core/lib/channel/call_tracer.h +17 -3
- data/src/core/lib/channel/channel_args.cc +24 -14
- data/src/core/lib/channel/channel_args.h +74 -13
- data/src/core/lib/channel/channel_stack.cc +27 -0
- data/src/core/lib/channel/channel_stack.h +10 -10
- data/src/core/lib/channel/connected_channel.cc +64 -18
- data/src/core/lib/channel/promise_based_filter.h +1041 -1
- data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
- data/src/core/lib/compression/compression_internal.cc +0 -3
- data/src/core/lib/event_engine/ares_resolver.cc +35 -14
- data/src/core/lib/event_engine/ares_resolver.h +9 -10
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
- data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
- data/src/core/lib/experiments/config.cc +13 -0
- data/src/core/lib/experiments/config.h +3 -0
- data/src/core/lib/experiments/experiments.cc +245 -366
- data/src/core/lib/experiments/experiments.h +50 -156
- data/src/core/lib/gprpp/debug_location.h +13 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
- data/src/core/lib/gprpp/orphanable.h +27 -0
- data/src/core/lib/gprpp/ref_counted.h +63 -22
- data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
- data/src/core/lib/gprpp/ref_counted_string.h +13 -0
- data/src/core/lib/gprpp/status_helper.cc +1 -2
- data/src/core/lib/iomgr/combiner.cc +15 -51
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
- data/src/core/lib/load_balancing/lb_policy.h +1 -1
- data/src/core/lib/promise/activity.cc +17 -2
- data/src/core/lib/promise/activity.h +5 -4
- data/src/core/lib/promise/all_ok.h +80 -0
- data/src/core/lib/promise/detail/join_state.h +2077 -0
- data/src/core/lib/promise/detail/promise_factory.h +1 -0
- data/src/core/lib/promise/detail/promise_like.h +8 -1
- data/src/core/lib/promise/detail/seq_state.h +3458 -150
- data/src/core/lib/promise/detail/status.h +42 -5
- data/src/core/lib/promise/for_each.h +13 -1
- data/src/core/lib/promise/if.h +4 -0
- data/src/core/lib/promise/latch.h +6 -3
- data/src/core/lib/promise/party.cc +33 -31
- data/src/core/lib/promise/party.h +142 -6
- data/src/core/lib/promise/poll.h +39 -13
- data/src/core/lib/promise/promise.h +4 -0
- data/src/core/lib/promise/seq.h +107 -7
- data/src/core/lib/promise/status_flag.h +196 -0
- data/src/core/lib/promise/try_join.h +132 -0
- data/src/core/lib/promise/try_seq.h +132 -10
- data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
- data/src/core/lib/resolver/endpoint_addresses.h +48 -0
- data/src/core/lib/resource_quota/arena.h +2 -2
- data/src/core/lib/resource_quota/memory_quota.cc +57 -8
- data/src/core/lib/resource_quota/memory_quota.h +6 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
- data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
- data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
- data/src/core/lib/security/transport/auth_filters.h +71 -4
- data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
- data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
- data/src/core/lib/slice/slice_buffer.h +3 -0
- data/src/core/lib/surface/builtins.cc +1 -1
- data/src/core/lib/surface/call.cc +683 -196
- data/src/core/lib/surface/call.h +26 -13
- data/src/core/lib/surface/call_trace.cc +42 -1
- data/src/core/lib/surface/channel.cc +0 -1
- data/src/core/lib/surface/channel.h +0 -6
- data/src/core/lib/surface/channel_init.h +26 -0
- data/src/core/lib/surface/init.cc +14 -8
- data/src/core/lib/surface/server.cc +256 -237
- data/src/core/lib/surface/server.h +26 -54
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
- data/src/core/lib/transport/call_final_info.cc +38 -0
- data/src/core/lib/transport/call_final_info.h +54 -0
- data/src/core/lib/transport/connectivity_state.cc +3 -2
- data/src/core/lib/transport/connectivity_state.h +4 -0
- data/src/core/lib/transport/metadata_batch.h +4 -4
- data/src/core/lib/transport/transport.cc +70 -19
- data/src/core/lib/transport/transport.h +395 -25
- data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +65 -43
- data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc.c +0 -1
- data/src/ruby/ext/grpc/rb_grpc.h +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/upb/upb/reflection/def_pool.h +2 -2
- data/third_party/zlib/adler32.c +5 -27
- data/third_party/zlib/compress.c +5 -16
- data/third_party/zlib/crc32.c +86 -162
- data/third_party/zlib/deflate.c +233 -336
- data/third_party/zlib/deflate.h +8 -8
- data/third_party/zlib/gzguts.h +11 -12
- data/third_party/zlib/infback.c +7 -23
- data/third_party/zlib/inffast.c +1 -4
- data/third_party/zlib/inffast.h +1 -1
- data/third_party/zlib/inflate.c +30 -99
- data/third_party/zlib/inftrees.c +6 -11
- data/third_party/zlib/inftrees.h +3 -3
- data/third_party/zlib/trees.c +224 -302
- data/third_party/zlib/uncompr.c +4 -12
- data/third_party/zlib/zconf.h +6 -2
- data/third_party/zlib/zlib.h +191 -188
- data/third_party/zlib/zutil.c +16 -44
- data/third_party/zlib/zutil.h +10 -10
- metadata +35 -13
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
- data/src/core/lib/event_engine/memory_allocator.cc +0 -74
- data/src/core/lib/transport/pid_controller.cc +0 -51
- data/src/core/lib/transport/pid_controller.h +0 -116
- data/third_party/upb/upb/collections/array.h +0 -17
- data/third_party/upb/upb/collections/map.h +0 -17
- data/third_party/upb/upb/upb.hpp +0 -18
data/third_party/zlib/trees.c
CHANGED
@@ -122,39 +122,116 @@ struct static_tree_desc_s {
|
|
122
122
|
int max_length; /* max bit length for the codes */
|
123
123
|
};
|
124
124
|
|
125
|
-
|
125
|
+
#ifdef NO_INIT_GLOBAL_POINTERS
|
126
|
+
# define TCONST
|
127
|
+
#else
|
128
|
+
# define TCONST const
|
129
|
+
#endif
|
130
|
+
|
131
|
+
local TCONST static_tree_desc static_l_desc =
|
126
132
|
{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
|
127
133
|
|
128
|
-
local
|
134
|
+
local TCONST static_tree_desc static_d_desc =
|
129
135
|
{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
|
130
136
|
|
131
|
-
local
|
137
|
+
local TCONST static_tree_desc static_bl_desc =
|
132
138
|
{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
|
133
139
|
|
134
140
|
/* ===========================================================================
|
135
|
-
*
|
141
|
+
* Output a short LSB first on the stream.
|
142
|
+
* IN assertion: there is enough room in pendingBuf.
|
143
|
+
*/
|
144
|
+
#define put_short(s, w) { \
|
145
|
+
put_byte(s, (uch)((w) & 0xff)); \
|
146
|
+
put_byte(s, (uch)((ush)(w) >> 8)); \
|
147
|
+
}
|
148
|
+
|
149
|
+
/* ===========================================================================
|
150
|
+
* Reverse the first len bits of a code, using straightforward code (a faster
|
151
|
+
* method would use a table)
|
152
|
+
* IN assertion: 1 <= len <= 15
|
136
153
|
*/
|
154
|
+
local unsigned bi_reverse(unsigned code, int len) {
|
155
|
+
register unsigned res = 0;
|
156
|
+
do {
|
157
|
+
res |= code & 1;
|
158
|
+
code >>= 1, res <<= 1;
|
159
|
+
} while (--len > 0);
|
160
|
+
return res >> 1;
|
161
|
+
}
|
137
162
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
local void
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
163
|
+
/* ===========================================================================
|
164
|
+
* Flush the bit buffer, keeping at most 7 bits in it.
|
165
|
+
*/
|
166
|
+
local void bi_flush(deflate_state *s) {
|
167
|
+
if (s->bi_valid == 16) {
|
168
|
+
put_short(s, s->bi_buf);
|
169
|
+
s->bi_buf = 0;
|
170
|
+
s->bi_valid = 0;
|
171
|
+
} else if (s->bi_valid >= 8) {
|
172
|
+
put_byte(s, (Byte)s->bi_buf);
|
173
|
+
s->bi_buf >>= 8;
|
174
|
+
s->bi_valid -= 8;
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
/* ===========================================================================
|
179
|
+
* Flush the bit buffer and align the output on a byte boundary
|
180
|
+
*/
|
181
|
+
local void bi_windup(deflate_state *s) {
|
182
|
+
if (s->bi_valid > 8) {
|
183
|
+
put_short(s, s->bi_buf);
|
184
|
+
} else if (s->bi_valid > 0) {
|
185
|
+
put_byte(s, (Byte)s->bi_buf);
|
186
|
+
}
|
187
|
+
s->bi_buf = 0;
|
188
|
+
s->bi_valid = 0;
|
189
|
+
#ifdef ZLIB_DEBUG
|
190
|
+
s->bits_sent = (s->bits_sent + 7) & ~7;
|
191
|
+
#endif
|
192
|
+
}
|
193
|
+
|
194
|
+
/* ===========================================================================
|
195
|
+
* Generate the codes for a given tree and bit counts (which need not be
|
196
|
+
* optimal).
|
197
|
+
* IN assertion: the array bl_count contains the bit length statistics for
|
198
|
+
* the given tree and the field len is set for all tree elements.
|
199
|
+
* OUT assertion: the field code is set for all tree elements of non
|
200
|
+
* zero code length.
|
201
|
+
*/
|
202
|
+
local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) {
|
203
|
+
ush next_code[MAX_BITS+1]; /* next code value for each bit length */
|
204
|
+
unsigned code = 0; /* running code value */
|
205
|
+
int bits; /* bit index */
|
206
|
+
int n; /* code index */
|
207
|
+
|
208
|
+
/* The distribution counts are first used to generate the code values
|
209
|
+
* without bit reversal.
|
210
|
+
*/
|
211
|
+
for (bits = 1; bits <= MAX_BITS; bits++) {
|
212
|
+
code = (code + bl_count[bits - 1]) << 1;
|
213
|
+
next_code[bits] = (ush)code;
|
214
|
+
}
|
215
|
+
/* Check that the bit counts in bl_count are consistent. The last code
|
216
|
+
* must be all ones.
|
217
|
+
*/
|
218
|
+
Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
|
219
|
+
"inconsistent bit counts");
|
220
|
+
Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
|
221
|
+
|
222
|
+
for (n = 0; n <= max_code; n++) {
|
223
|
+
int len = tree[n].Len;
|
224
|
+
if (len == 0) continue;
|
225
|
+
/* Now reverse the bits */
|
226
|
+
tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
|
227
|
+
|
228
|
+
Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
|
229
|
+
n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
|
230
|
+
}
|
231
|
+
}
|
155
232
|
|
156
233
|
#ifdef GEN_TREES_H
|
157
|
-
local void gen_trees_header
|
234
|
+
local void gen_trees_header(void);
|
158
235
|
#endif
|
159
236
|
|
160
237
|
#ifndef ZLIB_DEBUG
|
@@ -167,27 +244,12 @@ local void gen_trees_header OF((void));
|
|
167
244
|
send_bits(s, tree[c].Code, tree[c].Len); }
|
168
245
|
#endif
|
169
246
|
|
170
|
-
/* ===========================================================================
|
171
|
-
* Output a short LSB first on the stream.
|
172
|
-
* IN assertion: there is enough room in pendingBuf.
|
173
|
-
*/
|
174
|
-
#define put_short(s, w) { \
|
175
|
-
put_byte(s, (uch)((w) & 0xff)); \
|
176
|
-
put_byte(s, (uch)((ush)(w) >> 8)); \
|
177
|
-
}
|
178
|
-
|
179
247
|
/* ===========================================================================
|
180
248
|
* Send a value on a given number of bits.
|
181
249
|
* IN assertion: length <= 16 and value fits in length bits.
|
182
250
|
*/
|
183
251
|
#ifdef ZLIB_DEBUG
|
184
|
-
local void send_bits
|
185
|
-
|
186
|
-
local void send_bits(s, value, length)
|
187
|
-
deflate_state *s;
|
188
|
-
int value; /* value to send */
|
189
|
-
int length; /* number of bits */
|
190
|
-
{
|
252
|
+
local void send_bits(deflate_state *s, int value, int length) {
|
191
253
|
Tracevv((stderr," l %2d v %4x ", length, value));
|
192
254
|
Assert(length > 0 && length <= 15, "invalid length");
|
193
255
|
s->bits_sent += (ulg)length;
|
@@ -229,8 +291,7 @@ local void send_bits(s, value, length)
|
|
229
291
|
/* ===========================================================================
|
230
292
|
* Initialize the various 'constant' tables.
|
231
293
|
*/
|
232
|
-
local void tr_static_init()
|
233
|
-
{
|
294
|
+
local void tr_static_init(void) {
|
234
295
|
#if defined(GEN_TREES_H) || !defined(STDC)
|
235
296
|
static int static_init_done = 0;
|
236
297
|
int n; /* iterates over tree elements */
|
@@ -323,8 +384,7 @@ local void tr_static_init()
|
|
323
384
|
((i) == (last)? "\n};\n\n" : \
|
324
385
|
((i) % (width) == (width) - 1 ? ",\n" : ", "))
|
325
386
|
|
326
|
-
void gen_trees_header()
|
327
|
-
{
|
387
|
+
void gen_trees_header(void) {
|
328
388
|
FILE *header = fopen("trees.h", "w");
|
329
389
|
int i;
|
330
390
|
|
@@ -373,12 +433,26 @@ void gen_trees_header()
|
|
373
433
|
}
|
374
434
|
#endif /* GEN_TREES_H */
|
375
435
|
|
436
|
+
/* ===========================================================================
|
437
|
+
* Initialize a new block.
|
438
|
+
*/
|
439
|
+
local void init_block(deflate_state *s) {
|
440
|
+
int n; /* iterates over tree elements */
|
441
|
+
|
442
|
+
/* Initialize the trees. */
|
443
|
+
for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
|
444
|
+
for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
|
445
|
+
for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
|
446
|
+
|
447
|
+
s->dyn_ltree[END_BLOCK].Freq = 1;
|
448
|
+
s->opt_len = s->static_len = 0L;
|
449
|
+
s->sym_next = s->matches = 0;
|
450
|
+
}
|
451
|
+
|
376
452
|
/* ===========================================================================
|
377
453
|
* Initialize the tree data structures for a new zlib stream.
|
378
454
|
*/
|
379
|
-
void ZLIB_INTERNAL _tr_init(s)
|
380
|
-
deflate_state *s;
|
381
|
-
{
|
455
|
+
void ZLIB_INTERNAL _tr_init(deflate_state *s) {
|
382
456
|
tr_static_init();
|
383
457
|
|
384
458
|
s->l_desc.dyn_tree = s->dyn_ltree;
|
@@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s)
|
|
401
475
|
init_block(s);
|
402
476
|
}
|
403
477
|
|
404
|
-
/* ===========================================================================
|
405
|
-
* Initialize a new block.
|
406
|
-
*/
|
407
|
-
local void init_block(s)
|
408
|
-
deflate_state *s;
|
409
|
-
{
|
410
|
-
int n; /* iterates over tree elements */
|
411
|
-
|
412
|
-
/* Initialize the trees. */
|
413
|
-
for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
|
414
|
-
for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
|
415
|
-
for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
|
416
|
-
|
417
|
-
s->dyn_ltree[END_BLOCK].Freq = 1;
|
418
|
-
s->opt_len = s->static_len = 0L;
|
419
|
-
s->sym_next = s->matches = 0;
|
420
|
-
}
|
421
|
-
|
422
478
|
#define SMALLEST 1
|
423
479
|
/* Index within the heap array of least frequent node in the Huffman tree */
|
424
480
|
|
@@ -448,11 +504,7 @@ local void init_block(s)
|
|
448
504
|
* when the heap property is re-established (each father smaller than its
|
449
505
|
* two sons).
|
450
506
|
*/
|
451
|
-
local void pqdownheap(s, tree, k)
|
452
|
-
deflate_state *s;
|
453
|
-
ct_data *tree; /* the tree to restore */
|
454
|
-
int k; /* node to move down */
|
455
|
-
{
|
507
|
+
local void pqdownheap(deflate_state *s, ct_data *tree, int k) {
|
456
508
|
int v = s->heap[k];
|
457
509
|
int j = k << 1; /* left son of k */
|
458
510
|
while (j <= s->heap_len) {
|
@@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k)
|
|
483
535
|
* The length opt_len is updated; static_len is also updated if stree is
|
484
536
|
* not null.
|
485
537
|
*/
|
486
|
-
local void gen_bitlen(s, desc)
|
487
|
-
deflate_state *s;
|
488
|
-
tree_desc *desc; /* the tree descriptor */
|
489
|
-
{
|
538
|
+
local void gen_bitlen(deflate_state *s, tree_desc *desc) {
|
490
539
|
ct_data *tree = desc->dyn_tree;
|
491
540
|
int max_code = desc->max_code;
|
492
541
|
const ct_data *stree = desc->stat_desc->static_tree;
|
@@ -561,48 +610,9 @@ local void gen_bitlen(s, desc)
|
|
561
610
|
}
|
562
611
|
}
|
563
612
|
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
* IN assertion: the array bl_count contains the bit length statistics for
|
568
|
-
* the given tree and the field len is set for all tree elements.
|
569
|
-
* OUT assertion: the field code is set for all tree elements of non
|
570
|
-
* zero code length.
|
571
|
-
*/
|
572
|
-
local void gen_codes(tree, max_code, bl_count)
|
573
|
-
ct_data *tree; /* the tree to decorate */
|
574
|
-
int max_code; /* largest code with non zero frequency */
|
575
|
-
ushf *bl_count; /* number of codes at each bit length */
|
576
|
-
{
|
577
|
-
ush next_code[MAX_BITS+1]; /* next code value for each bit length */
|
578
|
-
unsigned code = 0; /* running code value */
|
579
|
-
int bits; /* bit index */
|
580
|
-
int n; /* code index */
|
581
|
-
|
582
|
-
/* The distribution counts are first used to generate the code values
|
583
|
-
* without bit reversal.
|
584
|
-
*/
|
585
|
-
for (bits = 1; bits <= MAX_BITS; bits++) {
|
586
|
-
code = (code + bl_count[bits - 1]) << 1;
|
587
|
-
next_code[bits] = (ush)code;
|
588
|
-
}
|
589
|
-
/* Check that the bit counts in bl_count are consistent. The last code
|
590
|
-
* must be all ones.
|
591
|
-
*/
|
592
|
-
Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
|
593
|
-
"inconsistent bit counts");
|
594
|
-
Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
|
595
|
-
|
596
|
-
for (n = 0; n <= max_code; n++) {
|
597
|
-
int len = tree[n].Len;
|
598
|
-
if (len == 0) continue;
|
599
|
-
/* Now reverse the bits */
|
600
|
-
tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
|
601
|
-
|
602
|
-
Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
|
603
|
-
n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
|
604
|
-
}
|
605
|
-
}
|
613
|
+
#ifdef DUMP_BL_TREE
|
614
|
+
# include <stdio.h>
|
615
|
+
#endif
|
606
616
|
|
607
617
|
/* ===========================================================================
|
608
618
|
* Construct one Huffman tree and assigns the code bit strings and lengths.
|
@@ -612,10 +622,7 @@ local void gen_codes(tree, max_code, bl_count)
|
|
612
622
|
* and corresponding code. The length opt_len is updated; static_len is
|
613
623
|
* also updated if stree is not null. The field max_code is set.
|
614
624
|
*/
|
615
|
-
local void build_tree(s, desc)
|
616
|
-
deflate_state *s;
|
617
|
-
tree_desc *desc; /* the tree descriptor */
|
618
|
-
{
|
625
|
+
local void build_tree(deflate_state *s, tree_desc *desc) {
|
619
626
|
ct_data *tree = desc->dyn_tree;
|
620
627
|
const ct_data *stree = desc->stat_desc->static_tree;
|
621
628
|
int elems = desc->stat_desc->elems;
|
@@ -700,11 +707,7 @@ local void build_tree(s, desc)
|
|
700
707
|
* Scan a literal or distance tree to determine the frequencies of the codes
|
701
708
|
* in the bit length tree.
|
702
709
|
*/
|
703
|
-
local void scan_tree(s, tree, max_code)
|
704
|
-
deflate_state *s;
|
705
|
-
ct_data *tree; /* the tree to be scanned */
|
706
|
-
int max_code; /* and its largest code of non zero frequency */
|
707
|
-
{
|
710
|
+
local void scan_tree(deflate_state *s, ct_data *tree, int max_code) {
|
708
711
|
int n; /* iterates over all tree elements */
|
709
712
|
int prevlen = -1; /* last emitted length */
|
710
713
|
int curlen; /* length of current code */
|
@@ -745,11 +748,7 @@ local void scan_tree(s, tree, max_code)
|
|
745
748
|
* Send a literal or distance tree in compressed form, using the codes in
|
746
749
|
* bl_tree.
|
747
750
|
*/
|
748
|
-
local void send_tree(s, tree, max_code)
|
749
|
-
deflate_state *s;
|
750
|
-
ct_data *tree; /* the tree to be scanned */
|
751
|
-
int max_code; /* and its largest code of non zero frequency */
|
752
|
-
{
|
751
|
+
local void send_tree(deflate_state *s, ct_data *tree, int max_code) {
|
753
752
|
int n; /* iterates over all tree elements */
|
754
753
|
int prevlen = -1; /* last emitted length */
|
755
754
|
int curlen; /* length of current code */
|
@@ -796,9 +795,7 @@ local void send_tree(s, tree, max_code)
|
|
796
795
|
* Construct the Huffman tree for the bit lengths and return the index in
|
797
796
|
* bl_order of the last bit length code to send.
|
798
797
|
*/
|
799
|
-
local int build_bl_tree(s)
|
800
|
-
deflate_state *s;
|
801
|
-
{
|
798
|
+
local int build_bl_tree(deflate_state *s) {
|
802
799
|
int max_blindex; /* index of last bit length code of non zero freq */
|
803
800
|
|
804
801
|
/* Determine the bit length frequencies for literal and distance trees */
|
@@ -831,10 +828,8 @@ local int build_bl_tree(s)
|
|
831
828
|
* lengths of the bit length codes, the literal tree and the distance tree.
|
832
829
|
* IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
|
833
830
|
*/
|
834
|
-
local void send_all_trees(s, lcodes, dcodes,
|
835
|
-
|
836
|
-
int lcodes, dcodes, blcodes; /* number of codes for each tree */
|
837
|
-
{
|
831
|
+
local void send_all_trees(deflate_state *s, int lcodes, int dcodes,
|
832
|
+
int blcodes) {
|
838
833
|
int rank; /* index in bl_order */
|
839
834
|
|
840
835
|
Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
|
@@ -860,12 +855,8 @@ local void send_all_trees(s, lcodes, dcodes, blcodes)
|
|
860
855
|
/* ===========================================================================
|
861
856
|
* Send a stored block
|
862
857
|
*/
|
863
|
-
void ZLIB_INTERNAL _tr_stored_block(s, buf,
|
864
|
-
|
865
|
-
charf *buf; /* input block */
|
866
|
-
ulg stored_len; /* length of input block */
|
867
|
-
int last; /* one if this is the last block for a file */
|
868
|
-
{
|
858
|
+
void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
|
859
|
+
ulg stored_len, int last) {
|
869
860
|
send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */
|
870
861
|
bi_windup(s); /* align on byte boundary */
|
871
862
|
put_short(s, (ush)stored_len);
|
@@ -884,9 +875,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
|
|
884
875
|
/* ===========================================================================
|
885
876
|
* Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
|
886
877
|
*/
|
887
|
-
void ZLIB_INTERNAL _tr_flush_bits(s)
|
888
|
-
deflate_state *s;
|
889
|
-
{
|
878
|
+
void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) {
|
890
879
|
bi_flush(s);
|
891
880
|
}
|
892
881
|
|
@@ -894,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s)
|
|
894
883
|
* Send one empty static block to give enough lookahead for inflate.
|
895
884
|
* This takes 10 bits, of which 7 may remain in the bit buffer.
|
896
885
|
*/
|
897
|
-
void ZLIB_INTERNAL _tr_align(s)
|
898
|
-
deflate_state *s;
|
899
|
-
{
|
886
|
+
void ZLIB_INTERNAL _tr_align(deflate_state *s) {
|
900
887
|
send_bits(s, STATIC_TREES<<1, 3);
|
901
888
|
send_code(s, END_BLOCK, static_ltree);
|
902
889
|
#ifdef ZLIB_DEBUG
|
@@ -905,16 +892,99 @@ void ZLIB_INTERNAL _tr_align(s)
|
|
905
892
|
bi_flush(s);
|
906
893
|
}
|
907
894
|
|
895
|
+
/* ===========================================================================
|
896
|
+
* Send the block data compressed using the given Huffman trees
|
897
|
+
*/
|
898
|
+
local void compress_block(deflate_state *s, const ct_data *ltree,
|
899
|
+
const ct_data *dtree) {
|
900
|
+
unsigned dist; /* distance of matched string */
|
901
|
+
int lc; /* match length or unmatched char (if dist == 0) */
|
902
|
+
unsigned sx = 0; /* running index in sym_buf */
|
903
|
+
unsigned code; /* the code to send */
|
904
|
+
int extra; /* number of extra bits to send */
|
905
|
+
|
906
|
+
if (s->sym_next != 0) do {
|
907
|
+
dist = s->sym_buf[sx++] & 0xff;
|
908
|
+
dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
|
909
|
+
lc = s->sym_buf[sx++];
|
910
|
+
if (dist == 0) {
|
911
|
+
send_code(s, lc, ltree); /* send a literal byte */
|
912
|
+
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
|
913
|
+
} else {
|
914
|
+
/* Here, lc is the match length - MIN_MATCH */
|
915
|
+
code = _length_code[lc];
|
916
|
+
send_code(s, code + LITERALS + 1, ltree); /* send length code */
|
917
|
+
extra = extra_lbits[code];
|
918
|
+
if (extra != 0) {
|
919
|
+
lc -= base_length[code];
|
920
|
+
send_bits(s, lc, extra); /* send the extra length bits */
|
921
|
+
}
|
922
|
+
dist--; /* dist is now the match distance - 1 */
|
923
|
+
code = d_code(dist);
|
924
|
+
Assert (code < D_CODES, "bad d_code");
|
925
|
+
|
926
|
+
send_code(s, code, dtree); /* send the distance code */
|
927
|
+
extra = extra_dbits[code];
|
928
|
+
if (extra != 0) {
|
929
|
+
dist -= (unsigned)base_dist[code];
|
930
|
+
send_bits(s, dist, extra); /* send the extra distance bits */
|
931
|
+
}
|
932
|
+
} /* literal or match pair ? */
|
933
|
+
|
934
|
+
/* Check that the overlay between pending_buf and sym_buf is ok: */
|
935
|
+
Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
|
936
|
+
|
937
|
+
} while (sx < s->sym_next);
|
938
|
+
|
939
|
+
send_code(s, END_BLOCK, ltree);
|
940
|
+
}
|
941
|
+
|
942
|
+
/* ===========================================================================
|
943
|
+
* Check if the data type is TEXT or BINARY, using the following algorithm:
|
944
|
+
* - TEXT if the two conditions below are satisfied:
|
945
|
+
* a) There are no non-portable control characters belonging to the
|
946
|
+
* "block list" (0..6, 14..25, 28..31).
|
947
|
+
* b) There is at least one printable character belonging to the
|
948
|
+
* "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
|
949
|
+
* - BINARY otherwise.
|
950
|
+
* - The following partially-portable control characters form a
|
951
|
+
* "gray list" that is ignored in this detection algorithm:
|
952
|
+
* (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
|
953
|
+
* IN assertion: the fields Freq of dyn_ltree are set.
|
954
|
+
*/
|
955
|
+
local int detect_data_type(deflate_state *s) {
|
956
|
+
/* block_mask is the bit mask of block-listed bytes
|
957
|
+
* set bits 0..6, 14..25, and 28..31
|
958
|
+
* 0xf3ffc07f = binary 11110011111111111100000001111111
|
959
|
+
*/
|
960
|
+
unsigned long block_mask = 0xf3ffc07fUL;
|
961
|
+
int n;
|
962
|
+
|
963
|
+
/* Check for non-textual ("block-listed") bytes. */
|
964
|
+
for (n = 0; n <= 31; n++, block_mask >>= 1)
|
965
|
+
if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
|
966
|
+
return Z_BINARY;
|
967
|
+
|
968
|
+
/* Check for textual ("allow-listed") bytes. */
|
969
|
+
if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
|
970
|
+
|| s->dyn_ltree[13].Freq != 0)
|
971
|
+
return Z_TEXT;
|
972
|
+
for (n = 32; n < LITERALS; n++)
|
973
|
+
if (s->dyn_ltree[n].Freq != 0)
|
974
|
+
return Z_TEXT;
|
975
|
+
|
976
|
+
/* There are no "block-listed" or "allow-listed" bytes:
|
977
|
+
* this stream either is empty or has tolerated ("gray-listed") bytes only.
|
978
|
+
*/
|
979
|
+
return Z_BINARY;
|
980
|
+
}
|
981
|
+
|
908
982
|
/* ===========================================================================
|
909
983
|
* Determine the best encoding for the current block: dynamic trees, static
|
910
984
|
* trees or store, and write out the encoded block.
|
911
985
|
*/
|
912
|
-
void ZLIB_INTERNAL _tr_flush_block(s, buf,
|
913
|
-
|
914
|
-
charf *buf; /* input block, or NULL if too old */
|
915
|
-
ulg stored_len; /* length of input block */
|
916
|
-
int last; /* one if this is the last block for a file */
|
917
|
-
{
|
986
|
+
void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
|
987
|
+
ulg stored_len, int last) {
|
918
988
|
ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
|
919
989
|
int max_blindex = 0; /* index of last bit length code of non zero freq */
|
920
990
|
|
@@ -1011,11 +1081,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
|
|
1011
1081
|
* Save the match info and tally the frequency counts. Return true if
|
1012
1082
|
* the current block must be flushed.
|
1013
1083
|
*/
|
1014
|
-
int ZLIB_INTERNAL _tr_tally(s, dist, lc)
|
1015
|
-
deflate_state *s;
|
1016
|
-
unsigned dist; /* distance of matched string */
|
1017
|
-
unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */
|
1018
|
-
{
|
1084
|
+
int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) {
|
1019
1085
|
s->sym_buf[s->sym_next++] = (uch)dist;
|
1020
1086
|
s->sym_buf[s->sym_next++] = (uch)(dist >> 8);
|
1021
1087
|
s->sym_buf[s->sym_next++] = (uch)lc;
|
@@ -1035,147 +1101,3 @@ int ZLIB_INTERNAL _tr_tally(s, dist, lc)
|
|
1035
1101
|
}
|
1036
1102
|
return (s->sym_next == s->sym_end);
|
1037
1103
|
}
|
1038
|
-
|
1039
|
-
/* ===========================================================================
|
1040
|
-
* Send the block data compressed using the given Huffman trees
|
1041
|
-
*/
|
1042
|
-
local void compress_block(s, ltree, dtree)
|
1043
|
-
deflate_state *s;
|
1044
|
-
const ct_data *ltree; /* literal tree */
|
1045
|
-
const ct_data *dtree; /* distance tree */
|
1046
|
-
{
|
1047
|
-
unsigned dist; /* distance of matched string */
|
1048
|
-
int lc; /* match length or unmatched char (if dist == 0) */
|
1049
|
-
unsigned sx = 0; /* running index in sym_buf */
|
1050
|
-
unsigned code; /* the code to send */
|
1051
|
-
int extra; /* number of extra bits to send */
|
1052
|
-
|
1053
|
-
if (s->sym_next != 0) do {
|
1054
|
-
dist = s->sym_buf[sx++] & 0xff;
|
1055
|
-
dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
|
1056
|
-
lc = s->sym_buf[sx++];
|
1057
|
-
if (dist == 0) {
|
1058
|
-
send_code(s, lc, ltree); /* send a literal byte */
|
1059
|
-
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
|
1060
|
-
} else {
|
1061
|
-
/* Here, lc is the match length - MIN_MATCH */
|
1062
|
-
code = _length_code[lc];
|
1063
|
-
send_code(s, code + LITERALS + 1, ltree); /* send length code */
|
1064
|
-
extra = extra_lbits[code];
|
1065
|
-
if (extra != 0) {
|
1066
|
-
lc -= base_length[code];
|
1067
|
-
send_bits(s, lc, extra); /* send the extra length bits */
|
1068
|
-
}
|
1069
|
-
dist--; /* dist is now the match distance - 1 */
|
1070
|
-
code = d_code(dist);
|
1071
|
-
Assert (code < D_CODES, "bad d_code");
|
1072
|
-
|
1073
|
-
send_code(s, code, dtree); /* send the distance code */
|
1074
|
-
extra = extra_dbits[code];
|
1075
|
-
if (extra != 0) {
|
1076
|
-
dist -= (unsigned)base_dist[code];
|
1077
|
-
send_bits(s, dist, extra); /* send the extra distance bits */
|
1078
|
-
}
|
1079
|
-
} /* literal or match pair ? */
|
1080
|
-
|
1081
|
-
/* Check that the overlay between pending_buf and sym_buf is ok: */
|
1082
|
-
Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
|
1083
|
-
|
1084
|
-
} while (sx < s->sym_next);
|
1085
|
-
|
1086
|
-
send_code(s, END_BLOCK, ltree);
|
1087
|
-
}
|
1088
|
-
|
1089
|
-
/* ===========================================================================
|
1090
|
-
* Check if the data type is TEXT or BINARY, using the following algorithm:
|
1091
|
-
* - TEXT if the two conditions below are satisfied:
|
1092
|
-
* a) There are no non-portable control characters belonging to the
|
1093
|
-
* "block list" (0..6, 14..25, 28..31).
|
1094
|
-
* b) There is at least one printable character belonging to the
|
1095
|
-
* "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
|
1096
|
-
* - BINARY otherwise.
|
1097
|
-
* - The following partially-portable control characters form a
|
1098
|
-
* "gray list" that is ignored in this detection algorithm:
|
1099
|
-
* (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
|
1100
|
-
* IN assertion: the fields Freq of dyn_ltree are set.
|
1101
|
-
*/
|
1102
|
-
local int detect_data_type(s)
|
1103
|
-
deflate_state *s;
|
1104
|
-
{
|
1105
|
-
/* block_mask is the bit mask of block-listed bytes
|
1106
|
-
* set bits 0..6, 14..25, and 28..31
|
1107
|
-
* 0xf3ffc07f = binary 11110011111111111100000001111111
|
1108
|
-
*/
|
1109
|
-
unsigned long block_mask = 0xf3ffc07fUL;
|
1110
|
-
int n;
|
1111
|
-
|
1112
|
-
/* Check for non-textual ("block-listed") bytes. */
|
1113
|
-
for (n = 0; n <= 31; n++, block_mask >>= 1)
|
1114
|
-
if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
|
1115
|
-
return Z_BINARY;
|
1116
|
-
|
1117
|
-
/* Check for textual ("allow-listed") bytes. */
|
1118
|
-
if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
|
1119
|
-
|| s->dyn_ltree[13].Freq != 0)
|
1120
|
-
return Z_TEXT;
|
1121
|
-
for (n = 32; n < LITERALS; n++)
|
1122
|
-
if (s->dyn_ltree[n].Freq != 0)
|
1123
|
-
return Z_TEXT;
|
1124
|
-
|
1125
|
-
/* There are no "block-listed" or "allow-listed" bytes:
|
1126
|
-
* this stream either is empty or has tolerated ("gray-listed") bytes only.
|
1127
|
-
*/
|
1128
|
-
return Z_BINARY;
|
1129
|
-
}
|
1130
|
-
|
1131
|
-
/* ===========================================================================
|
1132
|
-
* Reverse the first len bits of a code, using straightforward code (a faster
|
1133
|
-
* method would use a table)
|
1134
|
-
* IN assertion: 1 <= len <= 15
|
1135
|
-
*/
|
1136
|
-
local unsigned bi_reverse(code, len)
|
1137
|
-
unsigned code; /* the value to invert */
|
1138
|
-
int len; /* its bit length */
|
1139
|
-
{
|
1140
|
-
register unsigned res = 0;
|
1141
|
-
do {
|
1142
|
-
res |= code & 1;
|
1143
|
-
code >>= 1, res <<= 1;
|
1144
|
-
} while (--len > 0);
|
1145
|
-
return res >> 1;
|
1146
|
-
}
|
1147
|
-
|
1148
|
-
/* ===========================================================================
|
1149
|
-
* Flush the bit buffer, keeping at most 7 bits in it.
|
1150
|
-
*/
|
1151
|
-
local void bi_flush(s)
|
1152
|
-
deflate_state *s;
|
1153
|
-
{
|
1154
|
-
if (s->bi_valid == 16) {
|
1155
|
-
put_short(s, s->bi_buf);
|
1156
|
-
s->bi_buf = 0;
|
1157
|
-
s->bi_valid = 0;
|
1158
|
-
} else if (s->bi_valid >= 8) {
|
1159
|
-
put_byte(s, (Byte)s->bi_buf);
|
1160
|
-
s->bi_buf >>= 8;
|
1161
|
-
s->bi_valid -= 8;
|
1162
|
-
}
|
1163
|
-
}
|
1164
|
-
|
1165
|
-
/* ===========================================================================
|
1166
|
-
* Flush the bit buffer and align the output on a byte boundary
|
1167
|
-
*/
|
1168
|
-
local void bi_windup(s)
|
1169
|
-
deflate_state *s;
|
1170
|
-
{
|
1171
|
-
if (s->bi_valid > 8) {
|
1172
|
-
put_short(s, s->bi_buf);
|
1173
|
-
} else if (s->bi_valid > 0) {
|
1174
|
-
put_byte(s, (Byte)s->bi_buf);
|
1175
|
-
}
|
1176
|
-
s->bi_buf = 0;
|
1177
|
-
s->bi_valid = 0;
|
1178
|
-
#ifdef ZLIB_DEBUG
|
1179
|
-
s->bits_sent = (s->bits_sent + 7) & ~7;
|
1180
|
-
#endif
|
1181
|
-
}
|