grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -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
- local const static_tree_desc static_l_desc =
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 const static_tree_desc static_d_desc =
134
+ local TCONST static_tree_desc static_d_desc =
129
135
  {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
130
136
 
131
- local const static_tree_desc static_bl_desc =
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
- * Local (static) routines in this file.
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
- local void tr_static_init OF((void));
139
- local void init_block OF((deflate_state *s));
140
- local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
141
- local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
142
- local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
143
- local void build_tree OF((deflate_state *s, tree_desc *desc));
144
- local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
145
- local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
146
- local int build_bl_tree OF((deflate_state *s));
147
- local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
148
- int blcodes));
149
- local void compress_block OF((deflate_state *s, const ct_data *ltree,
150
- const ct_data *dtree));
151
- local int detect_data_type OF((deflate_state *s));
152
- local unsigned bi_reverse OF((unsigned code, int len));
153
- local void bi_windup OF((deflate_state *s));
154
- local void bi_flush OF((deflate_state *s));
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 OF((void));
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 OF((deflate_state *s, int value, int length));
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
- * Generate the codes for a given tree and bit counts (which need not be
566
- * optimal).
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, blcodes)
835
- deflate_state *s;
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, stored_len, last)
864
- deflate_state *s;
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, stored_len, last)
913
- deflate_state *s;
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
- }