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