ray 0.0.1 → 0.1.0.pre1

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 (188) hide show
  1. data/.gemtest +0 -0
  2. data/.yardopts +4 -0
  3. data/README.md +17 -21
  4. data/Rakefile +18 -139
  5. data/VERSION +1 -1
  6. data/ext/audio.cpp +723 -0
  7. data/ext/{color.c → color.cpp} +25 -13
  8. data/ext/drawable.cpp +91 -0
  9. data/ext/event.cpp +460 -0
  10. data/ext/extconf.rb +5 -104
  11. data/ext/font.cpp +190 -0
  12. data/ext/image.cpp +733 -0
  13. data/ext/input.cpp +74 -0
  14. data/ext/ray.cpp +168 -0
  15. data/ext/ray.hpp +356 -0
  16. data/ext/{rect.c → rect.cpp} +51 -37
  17. data/ext/shader.cpp +169 -0
  18. data/ext/shape.cpp +409 -0
  19. data/ext/sprite.cpp +306 -0
  20. data/ext/text.cpp +181 -0
  21. data/ext/vector.cpp +215 -0
  22. data/guide.md +619 -0
  23. data/lib/ray/audio.rb +0 -41
  24. data/lib/ray/color.rb +32 -10
  25. data/lib/ray/drawable.rb +16 -0
  26. data/lib/ray/dsl/event_listener.rb +25 -2
  27. data/lib/ray/dsl/event_runner.rb +33 -5
  28. data/lib/ray/dsl/event_translator.rb +66 -30
  29. data/lib/ray/dsl/handler.rb +3 -2
  30. data/lib/ray/dsl/matcher.rb +58 -14
  31. data/lib/ray/font.rb +38 -96
  32. data/lib/ray/font_set.rb +8 -8
  33. data/lib/ray/game.rb +87 -66
  34. data/lib/ray/helper.rb +105 -10
  35. data/lib/ray/image.rb +150 -24
  36. data/lib/ray/image_set.rb +3 -1
  37. data/lib/ray/input.rb +10 -0
  38. data/lib/ray/music_set.rb +5 -3
  39. data/lib/ray/ray.rb +21 -9
  40. data/lib/ray/rect.rb +48 -7
  41. data/lib/ray/rmagick.rb +41 -0
  42. data/lib/ray/scene.rb +99 -43
  43. data/lib/ray/scene_list.rb +67 -0
  44. data/lib/ray/shape.rb +132 -0
  45. data/lib/ray/sound_set.rb +4 -2
  46. data/lib/ray/sprite.rb +49 -111
  47. data/lib/ray/text.rb +101 -0
  48. data/lib/ray/text_helper.rb +37 -0
  49. data/lib/ray/turtle.rb +215 -0
  50. data/lib/ray/vector.rb +226 -0
  51. data/samples/audio/spacial.rb +44 -0
  52. data/samples/hello_world/hello.rb +9 -13
  53. data/samples/hello_world/hello_dsl.rb +8 -12
  54. data/samples/hello_world/text.rb +15 -0
  55. data/samples/opengl/binding.rb +38 -0
  56. data/samples/opengl/image.rb +32 -0
  57. data/samples/opengl/opengl.rb +34 -0
  58. data/samples/opengl/shader.rb +42 -0
  59. data/samples/pong/pong.rb +14 -10
  60. data/samples/run_scene.rb +53 -0
  61. data/samples/shaders/scene.rb +40 -0
  62. data/samples/shaders/shaders.rb +42 -0
  63. data/samples/shaders/shape.rb +34 -0
  64. data/samples/sokoban/sokoban.rb +18 -18
  65. data/samples/test/actual_scene.rb +41 -0
  66. data/samples/test/scene_riot.rb +39 -0
  67. data/samples/test/scene_spec.rb +32 -0
  68. data/samples/test/scene_test_unit.rb +25 -0
  69. data/samples/turtle/byzantium.rb +45 -0
  70. data/samples/turtle/hilbert.rb +48 -0
  71. data/samples/turtle/koch.rb +55 -0
  72. data/samples/turtle/mandala.rb +61 -0
  73. data/samples/turtle/tree.rb +57 -0
  74. data/test/audio_test.rb +69 -0
  75. data/test/color_test.rb +77 -0
  76. data/test/drawable_test.rb +19 -0
  77. data/test/dsl_test.rb +93 -0
  78. data/test/font_test.rb +57 -0
  79. data/test/helpers.rb +94 -0
  80. data/test/image_test.rb +82 -0
  81. data/test/ray_test.rb +25 -0
  82. data/test/rect_test.rb +121 -0
  83. data/{spec → test}/res/VeraMono.ttf +0 -0
  84. data/{spec → test}/res/aqua.bmp +0 -0
  85. data/{spec → test}/res/aqua.png +0 -0
  86. data/{spec → test}/res/aqua2.bmp +0 -0
  87. data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
  88. data/{spec → test}/res/pop.wav +0 -0
  89. data/test/resource_set_test.rb +99 -0
  90. data/test/run_all.rb +7 -0
  91. data/test/shape_test.rb +101 -0
  92. data/test/sprite_test.rb +89 -0
  93. data/test/text_test.rb +78 -0
  94. data/test/turtle_test.rb +176 -0
  95. data/test/vector_test.rb +111 -0
  96. data/yard_ext.rb +0 -28
  97. metadata +95 -139
  98. data/.gitignore +0 -23
  99. data/.gitmodules +0 -3
  100. data/.rspec +0 -3
  101. data/ext/audio.c +0 -473
  102. data/ext/event.c +0 -557
  103. data/ext/font.c +0 -287
  104. data/ext/image.c +0 -933
  105. data/ext/joystick.c +0 -145
  106. data/ext/ray.c +0 -489
  107. data/ext/ray.h +0 -245
  108. data/ext/ray_osx.m +0 -161
  109. data/lib/ray/joystick.rb +0 -30
  110. data/psp/SDL_psp_main.c +0 -84
  111. data/psp/bigdecimal/README +0 -60
  112. data/psp/bigdecimal/bigdecimal.c +0 -4697
  113. data/psp/bigdecimal/bigdecimal.h +0 -216
  114. data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
  115. data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
  116. data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
  117. data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
  118. data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
  119. data/psp/digest/bubblebabble/bubblebabble.c +0 -142
  120. data/psp/digest/defs.h +0 -20
  121. data/psp/digest/digest.c +0 -643
  122. data/psp/digest/digest.h +0 -32
  123. data/psp/digest/lib/digest.rb +0 -50
  124. data/psp/digest/lib/md5.rb +0 -27
  125. data/psp/digest/lib/sha1.rb +0 -27
  126. data/psp/digest/md5/md5.c +0 -420
  127. data/psp/digest/md5/md5.h +0 -80
  128. data/psp/digest/md5/md5init.c +0 -40
  129. data/psp/digest/rmd160/rmd160.c +0 -457
  130. data/psp/digest/rmd160/rmd160.h +0 -56
  131. data/psp/digest/rmd160/rmd160init.c +0 -40
  132. data/psp/digest/sha1/sha1.c +0 -269
  133. data/psp/digest/sha1/sha1.h +0 -39
  134. data/psp/digest/sha1/sha1init.c +0 -40
  135. data/psp/digest/sha2/lib/sha2.rb +0 -73
  136. data/psp/digest/sha2/sha2.c +0 -919
  137. data/psp/digest/sha2/sha2.h +0 -109
  138. data/psp/digest/sha2/sha2init.c +0 -52
  139. data/psp/enumerator/enumerator.c +0 -298
  140. data/psp/etc/etc.c +0 -559
  141. data/psp/ext.c +0 -289
  142. data/psp/fcntl/fcntl.c +0 -187
  143. data/psp/lib/rbconfig.rb +0 -178
  144. data/psp/nkf/lib/kconv.rb +0 -367
  145. data/psp/nkf/nkf-utf8/config.h +0 -88
  146. data/psp/nkf/nkf-utf8/nkf.c +0 -6040
  147. data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
  148. data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
  149. data/psp/nkf/nkf.c +0 -654
  150. data/psp/socket/addrinfo.h +0 -173
  151. data/psp/socket/getaddrinfo.c +0 -676
  152. data/psp/socket/getnameinfo.c +0 -270
  153. data/psp/socket/pspsocket.c +0 -71
  154. data/psp/socket/pspsocket.h +0 -28
  155. data/psp/socket/socket.c +0 -4662
  156. data/psp/socket/sockport.h +0 -76
  157. data/psp/stringio/stringio.c +0 -1306
  158. data/psp/strscan/strscan.c +0 -1320
  159. data/psp/syck/bytecode.c +0 -1166
  160. data/psp/syck/emitter.c +0 -1242
  161. data/psp/syck/gram.c +0 -1894
  162. data/psp/syck/gram.h +0 -79
  163. data/psp/syck/handler.c +0 -174
  164. data/psp/syck/implicit.c +0 -2990
  165. data/psp/syck/node.c +0 -408
  166. data/psp/syck/rubyext.c +0 -2367
  167. data/psp/syck/syck.c +0 -504
  168. data/psp/syck/syck.h +0 -456
  169. data/psp/syck/token.c +0 -2725
  170. data/psp/syck/yaml2byte.c +0 -257
  171. data/psp/syck/yamlbyte.h +0 -170
  172. data/psp/thread/thread.c +0 -1175
  173. data/psp/zlib/zlib.c +0 -3547
  174. data/script.rb +0 -10
  175. data/spec/ray/audio_spec.rb +0 -146
  176. data/spec/ray/color_spec.rb +0 -57
  177. data/spec/ray/event_spec.rb +0 -80
  178. data/spec/ray/font_spec.rb +0 -93
  179. data/spec/ray/image_set_spec.rb +0 -48
  180. data/spec/ray/image_spec.rb +0 -162
  181. data/spec/ray/joystick_spec.rb +0 -21
  182. data/spec/ray/matcher_spec.rb +0 -50
  183. data/spec/ray/ray_spec.rb +0 -88
  184. data/spec/ray/rect_spec.rb +0 -154
  185. data/spec/ray/resource_set_spec.rb +0 -105
  186. data/spec/ray/sprite_spec.rb +0 -163
  187. data/spec/spec.opts +0 -4
  188. data/spec/spec_helper.rb +0 -8
@@ -1,3547 +0,0 @@
1
- /*
2
- * zlib.c - An interface for zlib.
3
- *
4
- * Copyright (C) UENO Katsuhiro 2000-2003
5
- *
6
- * $Id: zlib.c 11708 2007-02-12 23:01:19Z shyouhei $
7
- */
8
-
9
- #include <ruby/ruby.h>
10
- #include <zlib.h>
11
- #include <time.h>
12
-
13
- #define RUBY_ZLIB_VERSION "0.6.0"
14
-
15
-
16
- #define OBJ_IS_FREED(val) (RBASIC(val)->flags == 0)
17
-
18
- #ifndef GZIP_SUPPORT
19
- #define GZIP_SUPPORT 1
20
- #endif
21
-
22
- /* from zutil.h */
23
- #ifndef DEF_MEM_LEVEL
24
- #if MAX_MEM_LEVEL >= 8
25
- #define DEF_MEM_LEVEL 8
26
- #else
27
- #define DEF_MEM_LEVEL MAX_MEM_LEVEL
28
- #endif
29
- #endif
30
-
31
-
32
- /*--------- Prototypes --------*/
33
-
34
- static NORETURN(void raise_zlib_error _((int, const char *)));
35
- static VALUE rb_zlib_version _((VALUE));
36
- static VALUE do_checksum _((int, VALUE*, uLong (*) _((uLong, const Bytef*, uInt))));
37
- static VALUE rb_zlib_adler32 _((int, VALUE*, VALUE));
38
- static VALUE rb_zlib_crc32 _((int, VALUE*, VALUE));
39
- static VALUE rb_zlib_crc_table _((VALUE));
40
- static voidpf zlib_mem_alloc _((voidpf, uInt, uInt));
41
- static void zlib_mem_free _((voidpf, voidpf));
42
- static void finalizer_warn _((const char*));
43
-
44
- struct zstream;
45
- struct zstream_funcs;
46
- static void zstream_init _((struct zstream*, const struct zstream_funcs *));
47
- static void zstream_expand_buffer _((struct zstream*));
48
- static void zstream_expand_buffer_into _((struct zstream*, int));
49
- static void zstream_append_buffer _((struct zstream*, const char*, int));
50
- static VALUE zstream_detach_buffer _((struct zstream*));
51
- static VALUE zstream_shift_buffer _((struct zstream*, int));
52
- static void zstream_buffer_ungetc _((struct zstream*, int));
53
- static void zstream_append_input _((struct zstream*, const char*, unsigned int));
54
- static void zstream_discard_input _((struct zstream*, unsigned int));
55
- static void zstream_reset_input _((struct zstream*));
56
- static void zstream_passthrough_input _((struct zstream*));
57
- static VALUE zstream_detach_input _((struct zstream*));
58
- static void zstream_reset _((struct zstream*));
59
- static VALUE zstream_end _((struct zstream*));
60
- static void zstream_run _((struct zstream*, Bytef*, uInt, int));
61
- static VALUE zstream_sync _((struct zstream*, Bytef*, uInt));
62
- static void zstream_mark _((struct zstream*));
63
- static void zstream_free _((struct zstream*));
64
- static VALUE zstream_new _((VALUE, const struct zstream_funcs*));
65
- static struct zstream *get_zstream _((VALUE));
66
- static void zstream_finalize _((struct zstream*));
67
-
68
- static VALUE rb_zstream_end _((VALUE));
69
- static VALUE rb_zstream_reset _((VALUE));
70
- static VALUE rb_zstream_finish _((VALUE));
71
- static VALUE rb_zstream_flush_next_in _((VALUE));
72
- static VALUE rb_zstream_flush_next_out _((VALUE));
73
- static VALUE rb_zstream_avail_out _((VALUE));
74
- static VALUE rb_zstream_set_avail_out _((VALUE, VALUE));
75
- static VALUE rb_zstream_avail_in _((VALUE));
76
- static VALUE rb_zstream_total_in _((VALUE));
77
- static VALUE rb_zstream_total_out _((VALUE));
78
- static VALUE rb_zstream_data_type _((VALUE));
79
- static VALUE rb_zstream_adler _((VALUE));
80
- static VALUE rb_zstream_finished_p _((VALUE));
81
- static VALUE rb_zstream_closed_p _((VALUE));
82
-
83
- static VALUE rb_deflate_s_allocate _((VALUE));
84
- static VALUE rb_deflate_initialize _((int, VALUE*, VALUE));
85
- static VALUE rb_deflate_init_copy _((VALUE, VALUE));
86
- static VALUE deflate_run _((VALUE));
87
- static VALUE rb_deflate_s_deflate _((int, VALUE*, VALUE));
88
- static void do_deflate _((struct zstream*, VALUE, int));
89
- static VALUE rb_deflate_deflate _((int, VALUE*, VALUE));
90
- static VALUE rb_deflate_addstr _((VALUE, VALUE));
91
- static VALUE rb_deflate_flush _((int, VALUE*, VALUE));
92
- static VALUE rb_deflate_params _((VALUE, VALUE, VALUE));
93
- static VALUE rb_deflate_set_dictionary _((VALUE, VALUE));
94
-
95
- static VALUE inflate_run _((VALUE));
96
- static VALUE rb_inflate_s_allocate _((VALUE));
97
- static VALUE rb_inflate_initialize _((int, VALUE*, VALUE));
98
- static VALUE rb_inflate_s_inflate _((VALUE, VALUE));
99
- static void do_inflate _((struct zstream*, VALUE));
100
- static VALUE rb_inflate_inflate _((VALUE, VALUE));
101
- static VALUE rb_inflate_addstr _((VALUE, VALUE));
102
- static VALUE rb_inflate_sync _((VALUE, VALUE));
103
- static VALUE rb_inflate_sync_point_p _((VALUE));
104
- static VALUE rb_inflate_set_dictionary _((VALUE, VALUE));
105
-
106
- #if GZIP_SUPPORT
107
- struct gzfile;
108
- static void gzfile_mark _((struct gzfile*));
109
- static void gzfile_free _((struct gzfile*));
110
- static VALUE gzfile_new _((VALUE, const struct zstream_funcs*, void (*) _((struct gzfile*))));
111
- static void gzfile_reset _((struct gzfile*));
112
- static void gzfile_close _((struct gzfile*, int));
113
- static void gzfile_write_raw _((struct gzfile*));
114
- static VALUE gzfile_read_raw _((struct gzfile*));
115
- static int gzfile_read_raw_ensure _((struct gzfile*, int));
116
- static char *gzfile_read_raw_until_zero _((struct gzfile*, long));
117
- static unsigned int gzfile_get16 _((const unsigned char*));
118
- static unsigned long gzfile_get32 _((const unsigned char*));
119
- static void gzfile_set32 _((unsigned long n, unsigned char*));
120
- static void gzfile_make_header _((struct gzfile*));
121
- static void gzfile_make_footer _((struct gzfile*));
122
- static void gzfile_read_header _((struct gzfile*));
123
- static void gzfile_check_footer _((struct gzfile*));
124
- static void gzfile_write _((struct gzfile*, Bytef*, uInt));
125
- static long gzfile_read_more _((struct gzfile*));
126
- static void gzfile_calc_crc _((struct gzfile*, VALUE));
127
- static VALUE gzfile_read _((struct gzfile*, int));
128
- static VALUE gzfile_read_all _((struct gzfile*));
129
- static void gzfile_ungetc _((struct gzfile*, int));
130
- static VALUE gzfile_writer_end_run _((VALUE));
131
- static void gzfile_writer_end _((struct gzfile*));
132
- static VALUE gzfile_reader_end_run _((VALUE));
133
- static void gzfile_reader_end _((struct gzfile*));
134
- static void gzfile_reader_rewind _((struct gzfile*));
135
- static VALUE gzfile_reader_get_unused _((struct gzfile*));
136
- static struct gzfile *get_gzfile _((VALUE));
137
- static VALUE gzfile_ensure_close _((VALUE));
138
- static VALUE rb_gzfile_s_wrap _((int, VALUE*, VALUE));
139
- static VALUE gzfile_s_open _((int, VALUE*, VALUE, const char*));
140
-
141
- static VALUE rb_gzfile_to_io _((VALUE));
142
- static VALUE rb_gzfile_crc _((VALUE));
143
- static VALUE rb_gzfile_mtime _((VALUE));
144
- static VALUE rb_gzfile_level _((VALUE));
145
- static VALUE rb_gzfile_os_code _((VALUE));
146
- static VALUE rb_gzfile_orig_name _((VALUE));
147
- static VALUE rb_gzfile_comment _((VALUE));
148
- static VALUE rb_gzfile_lineno _((VALUE));
149
- static VALUE rb_gzfile_set_lineno _((VALUE, VALUE));
150
- static VALUE rb_gzfile_set_mtime _((VALUE, VALUE));
151
- static VALUE rb_gzfile_set_orig_name _((VALUE, VALUE));
152
- static VALUE rb_gzfile_set_comment _((VALUE, VALUE));
153
- static VALUE rb_gzfile_close _((VALUE));
154
- static VALUE rb_gzfile_finish _((VALUE));
155
- static VALUE rb_gzfile_closed_p _((VALUE));
156
- static VALUE rb_gzfile_eof_p _((VALUE));
157
- static VALUE rb_gzfile_sync _((VALUE));
158
- static VALUE rb_gzfile_set_sync _((VALUE, VALUE));
159
- static VALUE rb_gzfile_total_in _((VALUE));
160
- static VALUE rb_gzfile_total_out _((VALUE));
161
-
162
- static VALUE rb_gzwriter_s_allocate _((VALUE));
163
- static VALUE rb_gzwriter_s_open _((int, VALUE*, VALUE));
164
- static VALUE rb_gzwriter_initialize _((int, VALUE*, VALUE));
165
- static VALUE rb_gzwriter_flush _((int, VALUE*, VALUE));
166
- static VALUE rb_gzwriter_write _((VALUE, VALUE));
167
- static VALUE rb_gzwriter_putc _((VALUE, VALUE));
168
-
169
- static VALUE rb_gzreader_s_allocate _((VALUE));
170
- static VALUE rb_gzreader_s_open _((int, VALUE*, VALUE));
171
- static VALUE rb_gzreader_initialize _((VALUE, VALUE));
172
- static VALUE rb_gzreader_rewind _((VALUE));
173
- static VALUE rb_gzreader_unused _((VALUE));
174
- static VALUE rb_gzreader_read _((int, VALUE*, VALUE));
175
- static VALUE rb_gzreader_getc _((VALUE));
176
- static VALUE rb_gzreader_readchar _((VALUE));
177
- static VALUE rb_gzreader_each_byte _((VALUE));
178
- static VALUE rb_gzreader_ungetc _((VALUE, VALUE));
179
- static void gzreader_skip_linebreaks _((struct gzfile*));
180
- static VALUE gzreader_gets _((int, VALUE*, VALUE));
181
- static VALUE rb_gzreader_gets _((int, VALUE*, VALUE));
182
- static VALUE rb_gzreader_readline _((int, VALUE*, VALUE));
183
- static VALUE rb_gzreader_each _((int, VALUE*, VALUE));
184
- static VALUE rb_gzreader_readlines _((int, VALUE*, VALUE));
185
- #endif /* GZIP_SUPPORT */
186
-
187
-
188
- void Init_zlib _((void));
189
-
190
-
191
-
192
- /*--------- Exceptions --------*/
193
-
194
- static VALUE cZError, cStreamEnd, cNeedDict;
195
- static VALUE cStreamError, cDataError, cMemError, cBufError, cVersionError;
196
-
197
- static void
198
- raise_zlib_error(err, msg)
199
- int err;
200
- const char *msg;
201
- {
202
- VALUE exc;
203
-
204
- if (!msg) {
205
- msg = zError(err);
206
- }
207
-
208
- switch(err) {
209
- case Z_STREAM_END:
210
- exc = rb_exc_new2(cStreamEnd, msg);
211
- break;
212
- case Z_NEED_DICT:
213
- exc = rb_exc_new2(cNeedDict, msg);
214
- break;
215
- case Z_STREAM_ERROR:
216
- exc = rb_exc_new2(cStreamError, msg);
217
- break;
218
- case Z_DATA_ERROR:
219
- exc = rb_exc_new2(cDataError, msg);
220
- break;
221
- case Z_BUF_ERROR:
222
- exc = rb_exc_new2(cBufError, msg);
223
- break;
224
- case Z_VERSION_ERROR:
225
- exc = rb_exc_new2(cVersionError, msg);
226
- break;
227
- case Z_MEM_ERROR:
228
- exc = rb_exc_new2(cMemError, msg);
229
- break;
230
- case Z_ERRNO:
231
- rb_sys_fail(msg);
232
- /* no return */
233
- default:
234
- {
235
- char buf[BUFSIZ];
236
- snprintf(buf, BUFSIZ, "unknown zlib error %d: %s", err, msg);
237
- exc = rb_exc_new2(cZError, buf);
238
- }
239
- }
240
-
241
- rb_exc_raise(exc);
242
- }
243
-
244
-
245
- /*--- Warning (in finalizer) ---*/
246
-
247
- static void
248
- finalizer_warn(msg)
249
- const char *msg;
250
- {
251
- fprintf(stderr, "zlib(finalizer): %s\n", msg);
252
- }
253
-
254
-
255
- /*-------- module Zlib --------*/
256
-
257
- /*
258
- * Returns the string which represents the version of zlib library.
259
- */
260
- static VALUE
261
- rb_zlib_version(klass)
262
- VALUE klass;
263
- {
264
- VALUE str;
265
-
266
- str = rb_str_new2(zlibVersion());
267
- OBJ_TAINT(str); /* for safe */
268
- return str;
269
- }
270
-
271
- static VALUE
272
- do_checksum(argc, argv, func)
273
- int argc;
274
- VALUE *argv;
275
- uLong (*func) _((uLong, const Bytef *, uInt));
276
- {
277
- VALUE str, vsum;
278
- unsigned long sum;
279
-
280
- rb_scan_args(argc, argv, "02", &str, &vsum);
281
-
282
- if (!NIL_P(vsum)) {
283
- sum = NUM2ULONG(vsum);
284
- }
285
- else if (NIL_P(str)) {
286
- sum = 0;
287
- }
288
- else {
289
- sum = func(0, Z_NULL, 0);
290
- }
291
-
292
- if (NIL_P(str)) {
293
- sum = func(sum, Z_NULL, 0);
294
- }
295
- else {
296
- StringValue(str);
297
- sum = func(sum, RSTRING(str)->ptr, RSTRING(str)->len);
298
- }
299
- return rb_uint2inum(sum);
300
- }
301
-
302
- /*
303
- * call-seq: Zlib.adler32(string, adler)
304
- *
305
- * Calculates Alder-32 checksum for +string+, and returns updated value of
306
- * +adler+. If +string+ is omitted, it returns the Adler-32 initial value. If
307
- * +adler+ is omitted, it assumes that the initial value is given to +adler+.
308
- *
309
- * FIXME: expression.
310
- */
311
- static VALUE
312
- rb_zlib_adler32(argc, argv, klass)
313
- int argc;
314
- VALUE *argv;
315
- VALUE klass;
316
- {
317
- return do_checksum(argc, argv, adler32);
318
- }
319
-
320
- /*
321
- * call-seq: Zlib.crc32(string, adler)
322
- *
323
- * Calculates CRC checksum for +string+, and returns updated value of +crc+. If
324
- * +string+ is omitted, it returns the CRC initial value. If +crc+ is omitted, it
325
- * assumes that the initial value is given to +crc+.
326
- *
327
- * FIXME: expression.
328
- */
329
- static VALUE
330
- rb_zlib_crc32(argc, argv, klass)
331
- int argc;
332
- VALUE *argv;
333
- VALUE klass;
334
- {
335
- return do_checksum(argc, argv, crc32);
336
- }
337
-
338
- /*
339
- * Returns the table for calculating CRC checksum as an array.
340
- */
341
- static VALUE
342
- rb_zlib_crc_table(obj)
343
- VALUE obj;
344
- {
345
- const unsigned long *crctbl;
346
- VALUE dst;
347
- int i;
348
-
349
- crctbl = get_crc_table();
350
- dst = rb_ary_new2(256);
351
-
352
- for (i = 0; i < 256; i++) {
353
- rb_ary_push(dst, rb_uint2inum(crctbl[i]));
354
- }
355
- return dst;
356
- }
357
-
358
-
359
-
360
- /*-------- zstream - internal APIs --------*/
361
-
362
- struct zstream {
363
- unsigned long flags;
364
- VALUE buf;
365
- long buf_filled;
366
- VALUE input;
367
- z_stream stream;
368
- const struct zstream_funcs {
369
- int (*reset) _((z_streamp));
370
- int (*end) _((z_streamp));
371
- int (*run) _((z_streamp, int));
372
- } *func;
373
- };
374
-
375
- #define ZSTREAM_FLAG_READY 0x1
376
- #define ZSTREAM_FLAG_IN_STREAM 0x2
377
- #define ZSTREAM_FLAG_FINISHED 0x4
378
- #define ZSTREAM_FLAG_CLOSING 0x8
379
- #define ZSTREAM_FLAG_UNUSED 0x10
380
-
381
- #define ZSTREAM_READY(z) ((z)->flags |= ZSTREAM_FLAG_READY)
382
- #define ZSTREAM_IS_READY(z) ((z)->flags & ZSTREAM_FLAG_READY)
383
- #define ZSTREAM_IS_FINISHED(z) ((z)->flags & ZSTREAM_FLAG_FINISHED)
384
- #define ZSTREAM_IS_CLOSING(z) ((z)->flags & ZSTREAM_FLAG_CLOSING)
385
-
386
- /* I think that more better value should be found,
387
- but I gave up finding it. B) */
388
- #define ZSTREAM_INITIAL_BUFSIZE 1024
389
- #define ZSTREAM_AVAIL_OUT_STEP_MAX 16384
390
- #define ZSTREAM_AVAIL_OUT_STEP_MIN 2048
391
-
392
- static const struct zstream_funcs deflate_funcs = {
393
- deflateReset, deflateEnd, deflate,
394
- };
395
-
396
- static const struct zstream_funcs inflate_funcs = {
397
- inflateReset, inflateEnd, inflate,
398
- };
399
-
400
-
401
- static voidpf
402
- zlib_mem_alloc(opaque, items, size)
403
- voidpf opaque;
404
- uInt items, size;
405
- {
406
- return xmalloc(items * size);
407
- }
408
-
409
- static void
410
- zlib_mem_free(opaque, address)
411
- voidpf opaque, address;
412
- {
413
- free(address);
414
- }
415
-
416
- static void
417
- zstream_init(z, func)
418
- struct zstream *z;
419
- const struct zstream_funcs *func;
420
- {
421
- z->flags = 0;
422
- z->buf = Qnil;
423
- z->buf_filled = 0;
424
- z->input = Qnil;
425
- z->stream.zalloc = zlib_mem_alloc;
426
- z->stream.zfree = zlib_mem_free;
427
- z->stream.opaque = Z_NULL;
428
- z->stream.msg = Z_NULL;
429
- z->stream.next_in = Z_NULL;
430
- z->stream.avail_in = 0;
431
- z->stream.next_out = Z_NULL;
432
- z->stream.avail_out = 0;
433
- z->func = func;
434
- }
435
-
436
- #define zstream_init_deflate(z) zstream_init((z), &deflate_funcs)
437
- #define zstream_init_inflate(z) zstream_init((z), &inflate_funcs)
438
-
439
- static void
440
- zstream_expand_buffer(z)
441
- struct zstream *z;
442
- {
443
- long inc;
444
-
445
- if (NIL_P(z->buf)) {
446
- /* I uses rb_str_new here not rb_str_buf_new because
447
- rb_str_buf_new makes a zero-length string. */
448
- z->buf = rb_str_new(0, ZSTREAM_INITIAL_BUFSIZE);
449
- z->buf_filled = 0;
450
- z->stream.next_out = RSTRING(z->buf)->ptr;
451
- z->stream.avail_out = ZSTREAM_INITIAL_BUFSIZE;
452
- RBASIC(z->buf)->klass = 0;
453
- return;
454
- }
455
-
456
- if (RSTRING(z->buf)->len - z->buf_filled >= ZSTREAM_AVAIL_OUT_STEP_MAX) {
457
- /* to keep other threads from freezing */
458
- z->stream.avail_out = ZSTREAM_AVAIL_OUT_STEP_MAX;
459
- }
460
- else {
461
- inc = z->buf_filled / 2;
462
- if (inc < ZSTREAM_AVAIL_OUT_STEP_MIN) {
463
- inc = ZSTREAM_AVAIL_OUT_STEP_MIN;
464
- }
465
- rb_str_resize(z->buf, z->buf_filled + inc);
466
- z->stream.avail_out = (inc < ZSTREAM_AVAIL_OUT_STEP_MAX) ?
467
- inc : ZSTREAM_AVAIL_OUT_STEP_MAX;
468
- }
469
- z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
470
- }
471
-
472
- static void
473
- zstream_expand_buffer_into(z, size)
474
- struct zstream *z;
475
- int size;
476
- {
477
- if (NIL_P(z->buf)) {
478
- /* I uses rb_str_new here not rb_str_buf_new because
479
- rb_str_buf_new makes a zero-length string. */
480
- z->buf = rb_str_new(0, size);
481
- z->buf_filled = 0;
482
- z->stream.next_out = RSTRING(z->buf)->ptr;
483
- z->stream.avail_out = size;
484
- RBASIC(z->buf)->klass = 0;
485
- }
486
- else if (z->stream.avail_out != size) {
487
- rb_str_resize(z->buf, z->buf_filled + size);
488
- z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
489
- z->stream.avail_out = size;
490
- }
491
- }
492
-
493
- static void
494
- zstream_append_buffer(z, src, len)
495
- struct zstream *z;
496
- const char *src;
497
- int len;
498
- {
499
- if (NIL_P(z->buf)) {
500
- z->buf = rb_str_buf_new(len);
501
- rb_str_buf_cat(z->buf, src, len);
502
- z->buf_filled = len;
503
- z->stream.next_out = RSTRING(z->buf)->ptr;
504
- z->stream.avail_out = 0;
505
- RBASIC(z->buf)->klass = 0;
506
- return;
507
- }
508
-
509
- if (RSTRING(z->buf)->len < z->buf_filled + len) {
510
- rb_str_resize(z->buf, z->buf_filled + len);
511
- z->stream.avail_out = 0;
512
- }
513
- else {
514
- if (z->stream.avail_out >= len) {
515
- z->stream.avail_out -= len;
516
- }
517
- else {
518
- z->stream.avail_out = 0;
519
- }
520
- }
521
- memcpy(RSTRING(z->buf)->ptr + z->buf_filled, src, len);
522
- z->buf_filled += len;
523
- z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
524
- }
525
-
526
- #define zstream_append_buffer2(z,v) \
527
- zstream_append_buffer((z),RSTRING(v)->ptr,RSTRING(v)->len)
528
-
529
- static VALUE
530
- zstream_detach_buffer(z)
531
- struct zstream *z;
532
- {
533
- VALUE dst;
534
-
535
- if (NIL_P(z->buf)) {
536
- dst = rb_str_new(0, 0);
537
- }
538
- else {
539
- dst = z->buf;
540
- rb_str_resize(dst, z->buf_filled);
541
- RBASIC(dst)->klass = rb_cString;
542
- }
543
-
544
- z->buf = Qnil;
545
- z->buf_filled = 0;
546
- z->stream.next_out = 0;
547
- z->stream.avail_out = 0;
548
- return dst;
549
- }
550
-
551
- static VALUE
552
- zstream_shift_buffer(z, len)
553
- struct zstream *z;
554
- int len;
555
- {
556
- VALUE dst;
557
-
558
- if (z->buf_filled <= len) {
559
- return zstream_detach_buffer(z);
560
- }
561
-
562
- dst = rb_str_substr(z->buf, 0, len);
563
- RBASIC(dst)->klass = rb_cString;
564
- z->buf_filled -= len;
565
- memmove(RSTRING(z->buf)->ptr, RSTRING(z->buf)->ptr + len,
566
- z->buf_filled);
567
- z->stream.next_out = RSTRING(z->buf)->ptr + z->buf_filled;
568
- z->stream.avail_out = RSTRING(z->buf)->len - z->buf_filled;
569
- if (z->stream.avail_out > ZSTREAM_AVAIL_OUT_STEP_MAX) {
570
- z->stream.avail_out = ZSTREAM_AVAIL_OUT_STEP_MAX;
571
- }
572
-
573
- return dst;
574
- }
575
-
576
- static void
577
- zstream_buffer_ungetc(z, c)
578
- struct zstream *z;
579
- int c;
580
- {
581
- if (NIL_P(z->buf) || RSTRING(z->buf)->len - z->buf_filled == 0) {
582
- zstream_expand_buffer(z);
583
- }
584
-
585
- memmove(RSTRING(z->buf)->ptr + 1, RSTRING(z->buf)->ptr, z->buf_filled);
586
- RSTRING(z->buf)->ptr[0] = (char)c;
587
- z->buf_filled++;
588
- if (z->stream.avail_out > 0) {
589
- z->stream.next_out++;
590
- z->stream.avail_out--;
591
- }
592
- }
593
-
594
- static void
595
- zstream_append_input(z, src, len)
596
- struct zstream *z;
597
- const char *src;
598
- unsigned int len;
599
- {
600
- if (len <= 0) return;
601
-
602
- if (NIL_P(z->input)) {
603
- z->input = rb_str_buf_new(len);
604
- rb_str_buf_cat(z->input, src, len);
605
- RBASIC(z->input)->klass = 0;
606
- }
607
- else {
608
- rb_str_buf_cat(z->input, src, len);
609
- }
610
- }
611
-
612
- #define zstream_append_input2(z,v)\
613
- zstream_append_input((z), RSTRING(v)->ptr, RSTRING(v)->len)
614
-
615
- static void
616
- zstream_discard_input(z, len)
617
- struct zstream *z;
618
- unsigned int len;
619
- {
620
- if (NIL_P(z->input) || RSTRING(z->input)->len <= len) {
621
- z->input = Qnil;
622
- }
623
- else {
624
- memmove(RSTRING(z->input)->ptr, RSTRING(z->input)->ptr + len,
625
- RSTRING(z->input)->len - len);
626
- rb_str_resize(z->input, RSTRING(z->input)->len - len);
627
- }
628
- }
629
-
630
- static void
631
- zstream_reset_input(z)
632
- struct zstream *z;
633
- {
634
- z->input = Qnil;
635
- }
636
-
637
- static void
638
- zstream_passthrough_input(z)
639
- struct zstream *z;
640
- {
641
- if (!NIL_P(z->input)) {
642
- zstream_append_buffer2(z, z->input);
643
- z->input = Qnil;
644
- }
645
- }
646
-
647
- static VALUE
648
- zstream_detach_input(z)
649
- struct zstream *z;
650
- {
651
- VALUE dst;
652
-
653
- if (NIL_P(z->input)) {
654
- dst = rb_str_new(0, 0);
655
- }
656
- else {
657
- dst = z->input;
658
- RBASIC(dst)->klass = rb_cString;
659
- }
660
- z->input = Qnil;
661
- return dst;
662
- }
663
-
664
- static void
665
- zstream_reset(z)
666
- struct zstream *z;
667
- {
668
- int err;
669
-
670
- err = z->func->reset(&z->stream);
671
- if (err != Z_OK) {
672
- raise_zlib_error(err, z->stream.msg);
673
- }
674
- z->flags = ZSTREAM_FLAG_READY;
675
- z->buf = Qnil;
676
- z->buf_filled = 0;
677
- z->stream.next_out = 0;
678
- z->stream.avail_out = 0;
679
- zstream_reset_input(z);
680
- }
681
-
682
- static VALUE
683
- zstream_end(z)
684
- struct zstream *z;
685
- {
686
- int err;
687
-
688
- if (!ZSTREAM_IS_READY(z)) {
689
- rb_warning("attempt to close uninitialized zstream; ignored.");
690
- return Qnil;
691
- }
692
- if (z->flags & ZSTREAM_FLAG_IN_STREAM) {
693
- rb_warning("attempt to close unfinished zstream; reset forced.");
694
- zstream_reset(z);
695
- }
696
-
697
- zstream_reset_input(z);
698
- err = z->func->end(&z->stream);
699
- if (err != Z_OK) {
700
- raise_zlib_error(err, z->stream.msg);
701
- }
702
- z->flags = 0;
703
- return Qnil;
704
- }
705
-
706
- static void
707
- zstream_run(z, src, len, flush)
708
- struct zstream *z;
709
- Bytef *src;
710
- uInt len;
711
- int flush;
712
- {
713
- uInt n;
714
- int err;
715
- volatile VALUE guard;
716
-
717
- if (NIL_P(z->input) && len == 0) {
718
- z->stream.next_in = "";
719
- z->stream.avail_in = 0;
720
- }
721
- else {
722
- zstream_append_input(z, src, len);
723
- z->stream.next_in = RSTRING(z->input)->ptr;
724
- z->stream.avail_in = RSTRING(z->input)->len;
725
- /* keep reference to `z->input' so as not to be garbage collected
726
- after zstream_reset_input() and prevent `z->stream.next_in'
727
- from dangling. */
728
- guard = z->input;
729
- }
730
-
731
- if (z->stream.avail_out == 0) {
732
- zstream_expand_buffer(z);
733
- }
734
-
735
- for (;;) {
736
- n = z->stream.avail_out;
737
- err = z->func->run(&z->stream, flush);
738
- z->buf_filled += n - z->stream.avail_out;
739
- rb_thread_schedule();
740
-
741
- if (err == Z_STREAM_END) {
742
- z->flags &= ~ZSTREAM_FLAG_IN_STREAM;
743
- z->flags |= ZSTREAM_FLAG_FINISHED;
744
- break;
745
- }
746
- if (err != Z_OK) {
747
- if (flush != Z_FINISH && err == Z_BUF_ERROR
748
- && z->stream.avail_out > 0) {
749
- z->flags |= ZSTREAM_FLAG_IN_STREAM;
750
- break;
751
- }
752
- zstream_reset_input(z);
753
- if (z->stream.avail_in > 0) {
754
- zstream_append_input(z, z->stream.next_in, z->stream.avail_in);
755
- }
756
- raise_zlib_error(err, z->stream.msg);
757
- }
758
- if (z->stream.avail_out > 0) {
759
- z->flags |= ZSTREAM_FLAG_IN_STREAM;
760
- break;
761
- }
762
- zstream_expand_buffer(z);
763
- }
764
-
765
- zstream_reset_input(z);
766
- if (z->stream.avail_in > 0) {
767
- zstream_append_input(z, z->stream.next_in, z->stream.avail_in);
768
- guard = Qnil; /* prevent tail call to make guard effective */
769
- }
770
- }
771
-
772
- static VALUE
773
- zstream_sync(z, src, len)
774
- struct zstream *z;
775
- Bytef *src;
776
- uInt len;
777
- {
778
- VALUE rest;
779
- int err;
780
-
781
- if (!NIL_P(z->input)) {
782
- z->stream.next_in = RSTRING(z->input)->ptr;
783
- z->stream.avail_in = RSTRING(z->input)->len;
784
- err = inflateSync(&z->stream);
785
- if (err == Z_OK) {
786
- zstream_discard_input(z,
787
- RSTRING(z->input)->len - z->stream.avail_in);
788
- zstream_append_input(z, src, len);
789
- return Qtrue;
790
- }
791
- zstream_reset_input(z);
792
- if (err != Z_DATA_ERROR) {
793
- rest = rb_str_new(z->stream.next_in, z->stream.avail_in);
794
- raise_zlib_error(err, z->stream.msg);
795
- }
796
- }
797
-
798
- if (len <= 0) return Qfalse;
799
-
800
- z->stream.next_in = src;
801
- z->stream.avail_in = len;
802
- err = inflateSync(&z->stream);
803
- if (err == Z_OK) {
804
- zstream_append_input(z, z->stream.next_in, z->stream.avail_in);
805
- return Qtrue;
806
- }
807
- if (err != Z_DATA_ERROR) {
808
- rest = rb_str_new(z->stream.next_in, z->stream.avail_in);
809
- raise_zlib_error(err, z->stream.msg);
810
- }
811
- return Qfalse;
812
- }
813
-
814
- static void
815
- zstream_mark(z)
816
- struct zstream *z;
817
- {
818
- rb_gc_mark(z->buf);
819
- rb_gc_mark(z->input);
820
- }
821
-
822
- static void
823
- zstream_finalize(z)
824
- struct zstream *z;
825
- {
826
- int err = z->func->end(&z->stream);
827
- if (err == Z_STREAM_ERROR)
828
- finalizer_warn("the stream state was inconsistent.");
829
- if (err == Z_DATA_ERROR)
830
- finalizer_warn("the stream was freed prematurely.");
831
- }
832
-
833
- static void
834
- zstream_free(z)
835
- struct zstream *z;
836
- {
837
- if (ZSTREAM_IS_READY(z)) {
838
- zstream_finalize(z);
839
- }
840
- free(z);
841
- }
842
-
843
- static VALUE
844
- zstream_new(klass, funcs)
845
- VALUE klass;
846
- const struct zstream_funcs *funcs;
847
- {
848
- VALUE obj;
849
- struct zstream *z;
850
-
851
- obj = Data_Make_Struct(klass, struct zstream,
852
- zstream_mark, zstream_free, z);
853
- zstream_init(z, funcs);
854
- return obj;
855
- }
856
-
857
- #define zstream_deflate_new(klass) zstream_new((klass), &deflate_funcs)
858
- #define zstream_inflate_new(klass) zstream_new((klass), &inflate_funcs)
859
-
860
- static struct zstream *
861
- get_zstream(obj)
862
- VALUE obj;
863
- {
864
- struct zstream *z;
865
-
866
- Data_Get_Struct(obj, struct zstream, z);
867
- if (!ZSTREAM_IS_READY(z)) {
868
- rb_raise(cZError, "stream is not ready");
869
- }
870
- return z;
871
- }
872
-
873
-
874
- /* ------------------------------------------------------------------------- */
875
-
876
- /*
877
- * Document-class: Zlib::ZStream
878
- *
879
- * Zlib::ZStream is the abstract class for the stream which handles the
880
- * compressed data. The operations are defined in the subclasses:
881
- * Zlib::Deflate for compression, and Zlib::Inflate for decompression.
882
- *
883
- * An instance of Zlib::ZStream has one stream (struct zstream in the source)
884
- * and two variable-length buffers which associated to the input (next_in) of
885
- * the stream and the output (next_out) of the stream. In this document,
886
- * "input buffer" means the buffer for input, and "output buffer" means the
887
- * buffer for output.
888
- *
889
- * Data input into an instance of Zlib::ZStream are temporally stored into
890
- * the end of input buffer, and then data in input buffer are processed from
891
- * the beginning of the buffer until no more output from the stream is
892
- * produced (i.e. until avail_out > 0 after processing). During processing,
893
- * output buffer is allocated and expanded automatically to hold all output
894
- * data.
895
- *
896
- * Some particular instance methods consume the data in output buffer and
897
- * return them as a String.
898
- *
899
- * Here is an ascii art for describing above:
900
- *
901
- * +================ an instance of Zlib::ZStream ================+
902
- * || ||
903
- * || +--------+ +-------+ +--------+ ||
904
- * || +--| output |<---------|zstream|<---------| input |<--+ ||
905
- * || | | buffer | next_out+-------+next_in | buffer | | ||
906
- * || | +--------+ +--------+ | ||
907
- * || | | ||
908
- * +===|======================================================|===+
909
- * | |
910
- * v |
911
- * "output data" "input data"
912
- *
913
- * If an error occurs during processing input buffer, an exception which is a
914
- * subclass of Zlib::Error is raised. At that time, both input and output
915
- * buffer keep their conditions at the time when the error occurs.
916
- *
917
- * == Method Catalogue
918
- *
919
- * Many of the methods in this class are fairly low-level and unlikely to be
920
- * of interest to users. In fact, users are unlikely to use this class
921
- * directly; rather they will be interested in Zlib::Inflate and
922
- * Zlib::Deflate.
923
- *
924
- * The higher level methods are listed below.
925
- *
926
- * - #total_in
927
- * - #total_out
928
- * - #data_type
929
- * - #adler
930
- * - #reset
931
- * - #finish
932
- * - #finished?
933
- * - #close
934
- * - #closed?
935
- */
936
-
937
- /*
938
- * Closes the stream. All operations on the closed stream will raise an
939
- * exception.
940
- */
941
- static VALUE
942
- rb_zstream_end(obj)
943
- VALUE obj;
944
- {
945
- zstream_end(get_zstream(obj));
946
- return Qnil;
947
- }
948
-
949
- /*
950
- * Resets and initializes the stream. All data in both input and output buffer
951
- * are discarded.
952
- */
953
- static VALUE
954
- rb_zstream_reset(obj)
955
- VALUE obj;
956
- {
957
- zstream_reset(get_zstream(obj));
958
- return Qnil;
959
- }
960
-
961
- /*
962
- * Finishes the stream and flushes output buffer. See Zlib::Deflate#finish and
963
- * Zlib::Inflate#finish for details of this behavior.
964
- */
965
- static VALUE
966
- rb_zstream_finish(obj)
967
- VALUE obj;
968
- {
969
- struct zstream *z = get_zstream(obj);
970
- VALUE dst;
971
-
972
- zstream_run(z, "", 0, Z_FINISH);
973
- dst = zstream_detach_buffer(z);
974
-
975
- OBJ_INFECT(dst, obj);
976
- return dst;
977
- }
978
-
979
- /*
980
- * Flushes input buffer and returns all data in that buffer.
981
- */
982
- static VALUE
983
- rb_zstream_flush_next_in(obj)
984
- VALUE obj;
985
- {
986
- struct zstream *z;
987
- VALUE dst;
988
-
989
- Data_Get_Struct(obj, struct zstream, z);
990
- dst = zstream_detach_input(z);
991
- OBJ_INFECT(dst, obj);
992
- return dst;
993
- }
994
-
995
- /*
996
- * Flushes output buffer and returns all data in that buffer.
997
- */
998
- static VALUE
999
- rb_zstream_flush_next_out(obj)
1000
- VALUE obj;
1001
- {
1002
- struct zstream *z;
1003
- VALUE dst;
1004
-
1005
- Data_Get_Struct(obj, struct zstream, z);
1006
- dst = zstream_detach_buffer(z);
1007
- OBJ_INFECT(dst, obj);
1008
- return dst;
1009
- }
1010
-
1011
- /*
1012
- * Returns number of bytes of free spaces in output buffer. Because the free
1013
- * space is allocated automatically, this method returns 0 normally.
1014
- */
1015
- static VALUE
1016
- rb_zstream_avail_out(obj)
1017
- VALUE obj;
1018
- {
1019
- struct zstream *z;
1020
- Data_Get_Struct(obj, struct zstream, z);
1021
- return rb_uint2inum(z->stream.avail_out);
1022
- }
1023
-
1024
- /*
1025
- * Allocates +size+ bytes of free space in the output buffer. If there are more
1026
- * than +size+ bytes already in the buffer, the buffer is truncated. Because
1027
- * free space is allocated automatically, you usually don't need to use this
1028
- * method.
1029
- */
1030
- static VALUE
1031
- rb_zstream_set_avail_out(obj, size)
1032
- VALUE obj, size;
1033
- {
1034
- struct zstream *z = get_zstream(obj);
1035
-
1036
- Check_Type(size, T_FIXNUM);
1037
- zstream_expand_buffer_into(z, FIX2INT(size));
1038
- return size;
1039
- }
1040
-
1041
- /*
1042
- * Returns bytes of data in the input buffer. Normally, returns 0.
1043
- */
1044
- static VALUE
1045
- rb_zstream_avail_in(obj)
1046
- VALUE obj;
1047
- {
1048
- struct zstream *z;
1049
- Data_Get_Struct(obj, struct zstream, z);
1050
- return INT2FIX(NIL_P(z->input) ? 0 : (int)(RSTRING(z->input)->len));
1051
- }
1052
-
1053
- /*
1054
- * Returns the total bytes of the input data to the stream. FIXME
1055
- */
1056
- static VALUE
1057
- rb_zstream_total_in(obj)
1058
- VALUE obj;
1059
- {
1060
- return rb_uint2inum(get_zstream(obj)->stream.total_in);
1061
- }
1062
-
1063
- /*
1064
- * Returns the total bytes of the output data from the stream. FIXME
1065
- */
1066
- static VALUE
1067
- rb_zstream_total_out(obj)
1068
- VALUE obj;
1069
- {
1070
- return rb_uint2inum(get_zstream(obj)->stream.total_out);
1071
- }
1072
-
1073
- /*
1074
- * Guesses the type of the data which have been inputed into the stream. The
1075
- * returned value is either <tt>Zlib::BINARY</tt>, <tt>Zlib::ASCII</tt>, or
1076
- * <tt>Zlib::UNKNOWN</tt>.
1077
- */
1078
- static VALUE
1079
- rb_zstream_data_type(obj)
1080
- VALUE obj;
1081
- {
1082
- return INT2FIX(get_zstream(obj)->stream.data_type);
1083
- }
1084
-
1085
- /*
1086
- * Returns the adler-32 checksum.
1087
- */
1088
- static VALUE
1089
- rb_zstream_adler(obj)
1090
- VALUE obj;
1091
- {
1092
- return rb_uint2inum(get_zstream(obj)->stream.adler);
1093
- }
1094
-
1095
- /*
1096
- * Returns true if the stream is finished.
1097
- */
1098
- static VALUE
1099
- rb_zstream_finished_p(obj)
1100
- VALUE obj;
1101
- {
1102
- return ZSTREAM_IS_FINISHED(get_zstream(obj)) ? Qtrue : Qfalse;
1103
- }
1104
-
1105
- /*
1106
- * Returns true if the stream is closed.
1107
- */
1108
- static VALUE
1109
- rb_zstream_closed_p(obj)
1110
- VALUE obj;
1111
- {
1112
- struct zstream *z;
1113
- Data_Get_Struct(obj, struct zstream, z);
1114
- return ZSTREAM_IS_READY(z) ? Qfalse : Qtrue;
1115
- }
1116
-
1117
-
1118
- /* ------------------------------------------------------------------------- */
1119
-
1120
- /*
1121
- * Document-class: Zlib::Deflate
1122
- *
1123
- * Zlib::Deflate is the class for compressing data. See Zlib::Stream for more
1124
- * information.
1125
- */
1126
-
1127
- #define FIXNUMARG(val, ifnil) \
1128
- (NIL_P((val)) ? (ifnil) \
1129
- : ((void)Check_Type((val), T_FIXNUM), FIX2INT((val))))
1130
-
1131
- #define ARG_LEVEL(val) FIXNUMARG((val), Z_DEFAULT_COMPRESSION)
1132
- #define ARG_WBITS(val) FIXNUMARG((val), MAX_WBITS)
1133
- #define ARG_MEMLEVEL(val) FIXNUMARG((val), DEF_MEM_LEVEL)
1134
- #define ARG_STRATEGY(val) FIXNUMARG((val), Z_DEFAULT_STRATEGY)
1135
- #define ARG_FLUSH(val) FIXNUMARG((val), Z_NO_FLUSH)
1136
-
1137
-
1138
- static VALUE
1139
- rb_deflate_s_allocate(klass)
1140
- VALUE klass;
1141
- {
1142
- return zstream_deflate_new(klass);
1143
- }
1144
-
1145
- /*
1146
- * call-seq: Zlib::Deflate.new(level=nil, windowBits=nil, memlevel=nil, strategy=nil)
1147
- *
1148
- * Creates a new deflate stream for compression. See zlib.h for details of
1149
- * each argument. If an argument is nil, the default value of that argument is
1150
- * used.
1151
- *
1152
- * TODO: document better!
1153
- */
1154
- static VALUE
1155
- rb_deflate_initialize(argc, argv, obj)
1156
- int argc;
1157
- VALUE *argv;
1158
- VALUE obj;
1159
- {
1160
- struct zstream *z;
1161
- VALUE level, wbits, memlevel, strategy;
1162
- int err;
1163
-
1164
- rb_scan_args(argc, argv, "04", &level, &wbits, &memlevel, &strategy);
1165
- Data_Get_Struct(obj, struct zstream, z);
1166
-
1167
- err = deflateInit2(&z->stream, ARG_LEVEL(level), Z_DEFLATED,
1168
- ARG_WBITS(wbits), ARG_MEMLEVEL(memlevel),
1169
- ARG_STRATEGY(strategy));
1170
- if (err != Z_OK) {
1171
- raise_zlib_error(err, z->stream.msg);
1172
- }
1173
- ZSTREAM_READY(z);
1174
-
1175
- return obj;
1176
- }
1177
-
1178
- /*
1179
- * Duplicates the deflate stream.
1180
- */
1181
- static VALUE
1182
- rb_deflate_init_copy(self, orig)
1183
- VALUE self, orig;
1184
- {
1185
- struct zstream *z1 = get_zstream(self);
1186
- struct zstream *z2 = get_zstream(orig);
1187
- int err;
1188
-
1189
- err = deflateCopy(&z1->stream, &z2->stream);
1190
- if (err != Z_OK) {
1191
- raise_zlib_error(err, 0);
1192
- }
1193
- z1->flags = z2->flags;
1194
-
1195
- return self;
1196
- }
1197
-
1198
- static VALUE
1199
- deflate_run(args)
1200
- VALUE args;
1201
- {
1202
- struct zstream *z = (struct zstream *)((VALUE *)args)[0];
1203
- VALUE src = ((VALUE *)args)[1];
1204
-
1205
- zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_FINISH);
1206
- return zstream_detach_buffer(z);
1207
- }
1208
-
1209
- /*
1210
- * call-seq: Zlib::Deflate.deflate(string[, level])
1211
- *
1212
- * Compresses the given +string+. Valid values of level are
1213
- * <tt>Zlib::NO_COMPRESSION</tt>, <tt>Zlib::BEST_SPEED</tt>,
1214
- * <tt>Zlib::BEST_COMPRESSION</tt>, <tt>Zlib::DEFAULT_COMPRESSION</tt>, and an
1215
- * integer from 0 to 9.
1216
- *
1217
- * This method is almost equivalent to the following code:
1218
- *
1219
- * def deflate(string, level)
1220
- * z = Zlib::Deflate.new(level)
1221
- * dst = z.deflate(string, Zlib::FINISH)
1222
- * z.close
1223
- * dst
1224
- * end
1225
- *
1226
- * TODO: what's default value of +level+?
1227
- *
1228
- */
1229
- static VALUE
1230
- rb_deflate_s_deflate(argc, argv, klass)
1231
- int argc;
1232
- VALUE *argv;
1233
- VALUE klass;
1234
- {
1235
- struct zstream z;
1236
- VALUE src, level, dst, args[2];
1237
- int err, lev;
1238
-
1239
- rb_scan_args(argc, argv, "11", &src, &level);
1240
-
1241
- lev = ARG_LEVEL(level);
1242
- StringValue(src);
1243
- zstream_init_deflate(&z);
1244
- err = deflateInit(&z.stream, lev);
1245
- if (err != Z_OK) {
1246
- raise_zlib_error(err, z.stream.msg);
1247
- }
1248
- ZSTREAM_READY(&z);
1249
-
1250
- args[0] = (VALUE)&z;
1251
- args[1] = src;
1252
- dst = rb_ensure(deflate_run, (VALUE)args, zstream_end, (VALUE)&z);
1253
-
1254
- OBJ_INFECT(dst, src);
1255
- return dst;
1256
- }
1257
-
1258
- static void
1259
- do_deflate(z, src, flush)
1260
- struct zstream *z;
1261
- VALUE src;
1262
- int flush;
1263
- {
1264
- if (NIL_P(src)) {
1265
- zstream_run(z, "", 0, Z_FINISH);
1266
- return;
1267
- }
1268
- StringValue(src);
1269
- if (flush != Z_NO_FLUSH || RSTRING(src)->len > 0) { /* prevent BUF_ERROR */
1270
- zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, flush);
1271
- }
1272
- }
1273
-
1274
- /*
1275
- * call-seq: deflate(string[, flush])
1276
- *
1277
- * Inputs +string+ into the deflate stream and returns the output from the
1278
- * stream. On calling this method, both the input and the output buffers of
1279
- * the stream are flushed. If +string+ is nil, this method finishes the
1280
- * stream, just like Zlib::ZStream#finish.
1281
- *
1282
- * The value of +flush+ should be either <tt>Zlib::NO_FLUSH</tt>,
1283
- * <tt>Zlib::SYNC_FLUSH</tt>, <tt>Zlib::FULL_FLUSH</tt>, or
1284
- * <tt>Zlib::FINISH</tt>. See zlib.h for details.
1285
- *
1286
- * TODO: document better!
1287
- */
1288
- static VALUE
1289
- rb_deflate_deflate(argc, argv, obj)
1290
- int argc;
1291
- VALUE *argv;
1292
- VALUE obj;
1293
- {
1294
- struct zstream *z = get_zstream(obj);
1295
- VALUE src, flush, dst;
1296
-
1297
- rb_scan_args(argc, argv, "11", &src, &flush);
1298
- OBJ_INFECT(obj, src);
1299
- do_deflate(z, src, ARG_FLUSH(flush));
1300
- dst = zstream_detach_buffer(z);
1301
-
1302
- OBJ_INFECT(dst, obj);
1303
- return dst;
1304
- }
1305
-
1306
- /*
1307
- * call-seq: << string
1308
- *
1309
- * Inputs +string+ into the deflate stream just like Zlib::Deflate#deflate, but
1310
- * returns the Zlib::Deflate object itself. The output from the stream is
1311
- * preserved in output buffer.
1312
- */
1313
- static VALUE
1314
- rb_deflate_addstr(obj, src)
1315
- VALUE obj, src;
1316
- {
1317
- OBJ_INFECT(obj, src);
1318
- do_deflate(get_zstream(obj), src, Z_NO_FLUSH);
1319
- return obj;
1320
- }
1321
-
1322
- /*
1323
- * call-seq: flush(flush)
1324
- *
1325
- * This method is equivalent to <tt>deflate('', flush)</tt>. If flush is omitted,
1326
- * <tt>Zlib::SYNC_FLUSH</tt> is used as flush. This method is just provided
1327
- * to improve the readability of your Ruby program.
1328
- *
1329
- * TODO: document better!
1330
- */
1331
- static VALUE
1332
- rb_deflate_flush(argc, argv, obj)
1333
- int argc;
1334
- VALUE *argv;
1335
- VALUE obj;
1336
- {
1337
- struct zstream *z = get_zstream(obj);
1338
- VALUE v_flush, dst;
1339
- int flush;
1340
-
1341
- rb_scan_args(argc, argv, "01", &v_flush);
1342
- flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
1343
- if (flush != Z_NO_FLUSH) { /* prevent Z_BUF_ERROR */
1344
- zstream_run(z, "", 0, flush);
1345
- }
1346
- dst = zstream_detach_buffer(z);
1347
-
1348
- OBJ_INFECT(dst, obj);
1349
- return dst;
1350
- }
1351
-
1352
- /*
1353
- * call-seq: params(level, strategy)
1354
- *
1355
- * Changes the parameters of the deflate stream. See zlib.h for details. The
1356
- * output from the stream by changing the params is preserved in output
1357
- * buffer.
1358
- *
1359
- * TODO: document better!
1360
- */
1361
- static VALUE
1362
- rb_deflate_params(obj, v_level, v_strategy)
1363
- VALUE obj, v_level, v_strategy;
1364
- {
1365
- struct zstream *z = get_zstream(obj);
1366
- int level, strategy;
1367
- int err;
1368
-
1369
- level = ARG_LEVEL(v_level);
1370
- strategy = ARG_STRATEGY(v_strategy);
1371
-
1372
- err = deflateParams(&z->stream, level, strategy);
1373
- while (err == Z_BUF_ERROR) {
1374
- rb_warning("deflateParams() returned Z_BUF_ERROR");
1375
- zstream_expand_buffer(z);
1376
- err = deflateParams(&z->stream, level, strategy);
1377
- }
1378
- if (err != Z_OK) {
1379
- raise_zlib_error(err, z->stream.msg);
1380
- }
1381
-
1382
- return Qnil;
1383
- }
1384
-
1385
- /*
1386
- * call-seq: set_dictionary(string)
1387
- *
1388
- * Sets the preset dictionary and returns +string+. This method is available
1389
- * just only after Zlib::Deflate.new or Zlib::ZStream#reset method was called.
1390
- * See zlib.h for details.
1391
- *
1392
- * TODO: document better!
1393
- */
1394
- static VALUE
1395
- rb_deflate_set_dictionary(obj, dic)
1396
- VALUE obj, dic;
1397
- {
1398
- struct zstream *z = get_zstream(obj);
1399
- VALUE src = dic;
1400
- int err;
1401
-
1402
- OBJ_INFECT(obj, dic);
1403
- StringValue(src);
1404
- err = deflateSetDictionary(&z->stream,
1405
- RSTRING(src)->ptr, RSTRING(src)->len);
1406
- if (err != Z_OK) {
1407
- raise_zlib_error(err, z->stream.msg);
1408
- }
1409
-
1410
- return dic;
1411
- }
1412
-
1413
-
1414
- /* ------------------------------------------------------------------------- */
1415
-
1416
- /*
1417
- * Document-class: Zlib::Inflate
1418
- *
1419
- * Zlib:Inflate is the class for decompressing compressed data. Unlike
1420
- * Zlib::Deflate, an instance of this class is not able to duplicate (clone,
1421
- * dup) itself.
1422
- */
1423
-
1424
-
1425
-
1426
- static VALUE
1427
- rb_inflate_s_allocate(klass)
1428
- VALUE klass;
1429
- {
1430
- return zstream_inflate_new(klass);
1431
- }
1432
-
1433
- /*
1434
- * call-seq: Zlib::Inflate.new(window_bits)
1435
- *
1436
- * Creates a new inflate stream for decompression. See zlib.h for details
1437
- * of the argument. If +window_bits+ is +nil+, the default value is used.
1438
- *
1439
- * TODO: document better!
1440
- */
1441
- static VALUE
1442
- rb_inflate_initialize(argc, argv, obj)
1443
- int argc;
1444
- VALUE *argv;
1445
- VALUE obj;
1446
- {
1447
- struct zstream *z;
1448
- VALUE wbits;
1449
- int err;
1450
-
1451
- rb_scan_args(argc, argv, "01", &wbits);
1452
- Data_Get_Struct(obj, struct zstream, z);
1453
-
1454
- err = inflateInit2(&z->stream, ARG_WBITS(wbits));
1455
- if (err != Z_OK) {
1456
- raise_zlib_error(err, z->stream.msg);
1457
- }
1458
- ZSTREAM_READY(z);
1459
-
1460
- return obj;
1461
- }
1462
-
1463
- static VALUE
1464
- inflate_run(args)
1465
- VALUE args;
1466
- {
1467
- struct zstream *z = (struct zstream *)((VALUE *)args)[0];
1468
- VALUE src = ((VALUE *)args)[1];
1469
-
1470
- zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH);
1471
- zstream_run(z, "", 0, Z_FINISH); /* for checking errors */
1472
- return zstream_detach_buffer(z);
1473
- }
1474
-
1475
- /*
1476
- * call-seq: Zlib::Inflate.inflate(string)
1477
- *
1478
- * Decompresses +string+. Raises a Zlib::NeedDict exception if a preset
1479
- * dictionary is needed for decompression.
1480
- *
1481
- * This method is almost equivalent to the following code:
1482
- *
1483
- * def inflate(string)
1484
- * zstream = Zlib::Inflate.new
1485
- * buf = zstream.inflate(string)
1486
- * zstream.finish
1487
- * zstream.close
1488
- * buf
1489
- * end
1490
- *
1491
- */
1492
- static VALUE
1493
- rb_inflate_s_inflate(obj, src)
1494
- VALUE obj, src;
1495
- {
1496
- struct zstream z;
1497
- VALUE dst, args[2];
1498
- int err;
1499
-
1500
- StringValue(src);
1501
- zstream_init_inflate(&z);
1502
- err = inflateInit(&z.stream);
1503
- if (err != Z_OK) {
1504
- raise_zlib_error(err, z.stream.msg);
1505
- }
1506
- ZSTREAM_READY(&z);
1507
-
1508
- args[0] = (VALUE)&z;
1509
- args[1] = src;
1510
- dst = rb_ensure(inflate_run, (VALUE)args, zstream_end, (VALUE)&z);
1511
-
1512
- OBJ_INFECT(dst, src);
1513
- return dst;
1514
- }
1515
-
1516
- static void
1517
- do_inflate(z, src)
1518
- struct zstream *z;
1519
- VALUE src;
1520
- {
1521
- if (NIL_P(src)) {
1522
- zstream_run(z, "", 0, Z_FINISH);
1523
- return;
1524
- }
1525
- StringValue(src);
1526
- if (RSTRING(src)->len > 0) { /* prevent Z_BUF_ERROR */
1527
- zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH);
1528
- }
1529
- }
1530
-
1531
- /*
1532
- * call-seq: inflate(string)
1533
- *
1534
- * Inputs +string+ into the inflate stream and returns the output from the
1535
- * stream. Calling this method, both the input and the output buffer of the
1536
- * stream are flushed. If string is +nil+, this method finishes the stream,
1537
- * just like Zlib::ZStream#finish.
1538
- *
1539
- * Raises a Zlib::NeedDict exception if a preset dictionary is needed to
1540
- * decompress. Set the dictionary by Zlib::Inflate#set_dictionary and then
1541
- * call this method again with an empty string. (<i>???</i>)
1542
- *
1543
- * TODO: document better!
1544
- */
1545
- static VALUE
1546
- rb_inflate_inflate(obj, src)
1547
- VALUE obj, src;
1548
- {
1549
- struct zstream *z = get_zstream(obj);
1550
- VALUE dst;
1551
-
1552
- OBJ_INFECT(obj, src);
1553
-
1554
- if (ZSTREAM_IS_FINISHED(z)) {
1555
- if (NIL_P(src)) {
1556
- dst = zstream_detach_buffer(z);
1557
- }
1558
- else {
1559
- StringValue(src);
1560
- zstream_append_buffer2(z, src);
1561
- dst = rb_str_new(0, 0);
1562
- }
1563
- }
1564
- else {
1565
- do_inflate(z, src);
1566
- dst = zstream_detach_buffer(z);
1567
- if (ZSTREAM_IS_FINISHED(z)) {
1568
- zstream_passthrough_input(z);
1569
- }
1570
- }
1571
-
1572
- OBJ_INFECT(dst, obj);
1573
- return dst;
1574
- }
1575
-
1576
- /*
1577
- * call-seq: << string
1578
- *
1579
- * Inputs +string+ into the inflate stream just like Zlib::Inflate#inflate, but
1580
- * returns the Zlib::Inflate object itself. The output from the stream is
1581
- * preserved in output buffer.
1582
- */
1583
- static VALUE
1584
- rb_inflate_addstr(obj, src)
1585
- VALUE obj, src;
1586
- {
1587
- struct zstream *z = get_zstream(obj);
1588
-
1589
- OBJ_INFECT(obj, src);
1590
-
1591
- if (ZSTREAM_IS_FINISHED(z)) {
1592
- if (!NIL_P(src)) {
1593
- StringValue(src);
1594
- zstream_append_buffer2(z, src);
1595
- }
1596
- }
1597
- else {
1598
- do_inflate(z, src);
1599
- if (ZSTREAM_IS_FINISHED(z)) {
1600
- zstream_passthrough_input(z);
1601
- }
1602
- }
1603
-
1604
- return obj;
1605
- }
1606
-
1607
- /*
1608
- * call-seq: sync(string)
1609
- *
1610
- * Inputs +string+ into the end of input buffer and skips data until a full
1611
- * flush point can be found. If the point is found in the buffer, this method
1612
- * flushes the buffer and returns false. Otherwise it returns +true+ and the
1613
- * following data of full flush point is preserved in the buffer.
1614
- */
1615
- static VALUE
1616
- rb_inflate_sync(obj, src)
1617
- VALUE obj, src;
1618
- {
1619
- struct zstream *z = get_zstream(obj);
1620
-
1621
- OBJ_INFECT(obj, src);
1622
- StringValue(src);
1623
- return zstream_sync(z, RSTRING(src)->ptr, RSTRING(src)->len);
1624
- }
1625
-
1626
- /*
1627
- * Quoted verbatim from original documentation:
1628
- *
1629
- * What is this?
1630
- *
1631
- * <tt>:)</tt>
1632
- */
1633
- static VALUE
1634
- rb_inflate_sync_point_p(obj)
1635
- VALUE obj;
1636
- {
1637
- struct zstream *z = get_zstream(obj);
1638
- int err;
1639
-
1640
- err = inflateSyncPoint(&z->stream);
1641
- if (err == 1) {
1642
- return Qtrue;
1643
- }
1644
- if (err != Z_OK) {
1645
- raise_zlib_error(err, z->stream.msg);
1646
- }
1647
- return Qfalse;
1648
- }
1649
-
1650
- /*
1651
- * Sets the preset dictionary and returns +string+. This method is available just
1652
- * only after a Zlib::NeedDict exception was raised. See zlib.h for details.
1653
- *
1654
- * TODO: document better!
1655
- */
1656
- static VALUE
1657
- rb_inflate_set_dictionary(obj, dic)
1658
- VALUE obj, dic;
1659
- {
1660
- struct zstream *z = get_zstream(obj);
1661
- VALUE src = dic;
1662
- int err;
1663
-
1664
- OBJ_INFECT(obj, dic);
1665
- StringValue(src);
1666
- err = inflateSetDictionary(&z->stream,
1667
- RSTRING(src)->ptr, RSTRING(src)->len);
1668
- if (err != Z_OK) {
1669
- raise_zlib_error(err, z->stream.msg);
1670
- }
1671
-
1672
- return dic;
1673
- }
1674
-
1675
-
1676
-
1677
- #if GZIP_SUPPORT
1678
-
1679
- /* NOTE: Features for gzip files of Ruby/zlib are written from scratch
1680
- * and using undocumented feature of zlib, negative wbits.
1681
- * I don't think gzFile APIs of zlib are good for Ruby.
1682
- */
1683
-
1684
- /*------- .gz file header --------*/
1685
-
1686
- #define GZ_MAGIC1 0x1f
1687
- #define GZ_MAGIC2 0x8b
1688
- #define GZ_METHOD_DEFLATE 8
1689
- #define GZ_FLAG_MULTIPART 0x2
1690
- #define GZ_FLAG_EXTRA 0x4
1691
- #define GZ_FLAG_ORIG_NAME 0x8
1692
- #define GZ_FLAG_COMMENT 0x10
1693
- #define GZ_FLAG_ENCRYPT 0x20
1694
- #define GZ_FLAG_UNKNOWN_MASK 0xc0
1695
-
1696
- #define GZ_EXTRAFLAG_FAST 0x4
1697
- #define GZ_EXTRAFLAG_SLOW 0x2
1698
-
1699
- /* from zutil.h */
1700
- #define OS_MSDOS 0x00
1701
- #define OS_AMIGA 0x01
1702
- #define OS_VMS 0x02
1703
- #define OS_UNIX 0x03
1704
- #define OS_ATARI 0x05
1705
- #define OS_OS2 0x06
1706
- #define OS_MACOS 0x07
1707
- #define OS_TOPS20 0x0a
1708
- #define OS_WIN32 0x0b
1709
-
1710
- #define OS_VMCMS 0x04
1711
- #define OS_ZSYSTEM 0x08
1712
- #define OS_CPM 0x09
1713
- #define OS_QDOS 0x0c
1714
- #define OS_RISCOS 0x0d
1715
- #define OS_UNKNOWN 0xff
1716
-
1717
- #ifndef OS_CODE
1718
- #define OS_CODE OS_UNIX
1719
- #endif
1720
-
1721
- static ID id_write, id_read, id_flush, id_seek, id_close;
1722
- static VALUE cGzError, cNoFooter, cCRCError, cLengthError;
1723
-
1724
-
1725
-
1726
- /*-------- gzfile internal APIs --------*/
1727
-
1728
- struct gzfile {
1729
- struct zstream z;
1730
- VALUE io;
1731
- int level;
1732
- time_t mtime; /* for header */
1733
- int os_code; /* for header */
1734
- VALUE orig_name; /* for header; must be a String */
1735
- VALUE comment; /* for header; must be a String */
1736
- unsigned long crc;
1737
- int lineno;
1738
- int ungetc;
1739
- void (*end)(struct gzfile *);
1740
- };
1741
-
1742
- #define GZFILE_FLAG_SYNC ZSTREAM_FLAG_UNUSED
1743
- #define GZFILE_FLAG_HEADER_FINISHED (ZSTREAM_FLAG_UNUSED << 1)
1744
- #define GZFILE_FLAG_FOOTER_FINISHED (ZSTREAM_FLAG_UNUSED << 2)
1745
-
1746
- #define GZFILE_IS_FINISHED(gz) \
1747
- (ZSTREAM_IS_FINISHED(&gz->z) && (gz)->z.buf_filled == 0)
1748
-
1749
- #define GZFILE_READ_SIZE 2048
1750
-
1751
-
1752
- static void
1753
- gzfile_mark(gz)
1754
- struct gzfile *gz;
1755
- {
1756
- rb_gc_mark(gz->io);
1757
- rb_gc_mark(gz->orig_name);
1758
- rb_gc_mark(gz->comment);
1759
- zstream_mark(&gz->z);
1760
- }
1761
-
1762
- static void
1763
- gzfile_free(gz)
1764
- struct gzfile *gz;
1765
- {
1766
- struct zstream *z = &gz->z;
1767
-
1768
- if (ZSTREAM_IS_READY(z)) {
1769
- if (z->func == &deflate_funcs) {
1770
- finalizer_warn("Zlib::GzipWriter object must be closed explicitly.");
1771
- }
1772
- zstream_finalize(z);
1773
- }
1774
- free(gz);
1775
- }
1776
-
1777
- static VALUE
1778
- gzfile_new(klass, funcs, endfunc)
1779
- VALUE klass;
1780
- const struct zstream_funcs *funcs;
1781
- void (*endfunc) _((struct gzfile *));
1782
- {
1783
- VALUE obj;
1784
- struct gzfile *gz;
1785
-
1786
- obj = Data_Make_Struct(klass, struct gzfile, gzfile_mark, gzfile_free, gz);
1787
- zstream_init(&gz->z, funcs);
1788
- gz->io = Qnil;
1789
- gz->level = 0;
1790
- gz->mtime = 0;
1791
- gz->os_code = OS_CODE;
1792
- gz->orig_name = Qnil;
1793
- gz->comment = Qnil;
1794
- gz->crc = crc32(0, Z_NULL, 0);
1795
- gz->lineno = 0;
1796
- gz->ungetc = 0;
1797
- gz->end = endfunc;
1798
-
1799
- return obj;
1800
- }
1801
-
1802
- #define gzfile_writer_new(gz) gzfile_new((gz),&deflate_funcs,gzfile_writer_end)
1803
- #define gzfile_reader_new(gz) gzfile_new((gz),&inflate_funcs,gzfile_reader_end)
1804
-
1805
- static void
1806
- gzfile_reset(gz)
1807
- struct gzfile *gz;
1808
- {
1809
- zstream_reset(&gz->z);
1810
- gz->crc = crc32(0, Z_NULL, 0);
1811
- gz->lineno = 0;
1812
- gz->ungetc = 0;
1813
- }
1814
-
1815
- static void
1816
- gzfile_close(gz, closeflag)
1817
- struct gzfile *gz;
1818
- int closeflag;
1819
- {
1820
- VALUE io = gz->io;
1821
-
1822
- gz->end(gz);
1823
- gz->io = Qnil;
1824
- gz->orig_name = Qnil;
1825
- gz->comment = Qnil;
1826
- if (closeflag && rb_respond_to(io, id_close)) {
1827
- rb_funcall(io, id_close, 0);
1828
- }
1829
- }
1830
-
1831
- static void
1832
- gzfile_write_raw(gz)
1833
- struct gzfile *gz;
1834
- {
1835
- VALUE str;
1836
-
1837
- if (gz->z.buf_filled > 0) {
1838
- str = zstream_detach_buffer(&gz->z);
1839
- OBJ_TAINT(str); /* for safe */
1840
- rb_funcall(gz->io, id_write, 1, str);
1841
- if ((gz->z.flags & GZFILE_FLAG_SYNC)
1842
- && rb_respond_to(gz->io, id_flush))
1843
- rb_funcall(gz->io, id_flush, 0);
1844
- }
1845
- }
1846
-
1847
- static VALUE
1848
- gzfile_read_raw(gz)
1849
- struct gzfile *gz;
1850
- {
1851
- VALUE str;
1852
-
1853
- str = rb_funcall(gz->io, id_read, 1, INT2FIX(GZFILE_READ_SIZE));
1854
- if (!NIL_P(str)) {
1855
- Check_Type(str, T_STRING);
1856
- }
1857
- return str;
1858
- }
1859
-
1860
- static int
1861
- gzfile_read_raw_ensure(gz, size)
1862
- struct gzfile *gz;
1863
- int size;
1864
- {
1865
- VALUE str;
1866
-
1867
- while (NIL_P(gz->z.input) || RSTRING(gz->z.input)->len < size) {
1868
- str = gzfile_read_raw(gz);
1869
- if (NIL_P(str)) return Qfalse;
1870
- zstream_append_input2(&gz->z, str);
1871
- }
1872
- return Qtrue;
1873
- }
1874
-
1875
- static char *
1876
- gzfile_read_raw_until_zero(gz, offset)
1877
- struct gzfile *gz;
1878
- long offset;
1879
- {
1880
- VALUE str;
1881
- char *p;
1882
-
1883
- for (;;) {
1884
- p = memchr(RSTRING(gz->z.input)->ptr + offset, '\0',
1885
- RSTRING(gz->z.input)->len - offset);
1886
- if (p) break;
1887
- str = gzfile_read_raw(gz);
1888
- if (NIL_P(str)) {
1889
- rb_raise(cGzError, "unexpected end of file");
1890
- }
1891
- offset = RSTRING(gz->z.input)->len;
1892
- zstream_append_input2(&gz->z, str);
1893
- }
1894
- return p;
1895
- }
1896
-
1897
- static unsigned int
1898
- gzfile_get16(src)
1899
- const unsigned char *src;
1900
- {
1901
- unsigned int n;
1902
- n = *(src++) & 0xff;
1903
- n |= (*(src++) & 0xff) << 8;
1904
- return n;
1905
- }
1906
-
1907
- static unsigned long
1908
- gzfile_get32(src)
1909
- const unsigned char *src;
1910
- {
1911
- unsigned long n;
1912
- n = *(src++) & 0xff;
1913
- n |= (*(src++) & 0xff) << 8;
1914
- n |= (*(src++) & 0xff) << 16;
1915
- n |= (*(src++) & 0xffU) << 24;
1916
- return n;
1917
- }
1918
-
1919
- static void
1920
- gzfile_set32(n, dst)
1921
- unsigned long n;
1922
- unsigned char *dst;
1923
- {
1924
- *(dst++) = n & 0xff;
1925
- *(dst++) = (n >> 8) & 0xff;
1926
- *(dst++) = (n >> 16) & 0xff;
1927
- *dst = (n >> 24) & 0xff;
1928
- }
1929
-
1930
- static void
1931
- gzfile_make_header(gz)
1932
- struct gzfile *gz;
1933
- {
1934
- unsigned char buf[10]; /* the size of gzip header */
1935
- unsigned char flags = 0, extraflags = 0;
1936
-
1937
- if (!NIL_P(gz->orig_name)) {
1938
- flags |= GZ_FLAG_ORIG_NAME;
1939
- }
1940
- if (!NIL_P(gz->comment)) {
1941
- flags |= GZ_FLAG_COMMENT;
1942
- }
1943
- if (gz->mtime == 0) {
1944
- gz->mtime = time(0);
1945
- }
1946
-
1947
- if (gz->level == Z_BEST_SPEED) {
1948
- extraflags |= GZ_EXTRAFLAG_FAST;
1949
- }
1950
- else if (gz->level == Z_BEST_COMPRESSION) {
1951
- extraflags |= GZ_EXTRAFLAG_SLOW;
1952
- }
1953
-
1954
- buf[0] = GZ_MAGIC1;
1955
- buf[1] = GZ_MAGIC2;
1956
- buf[2] = GZ_METHOD_DEFLATE;
1957
- buf[3] = flags;
1958
- gzfile_set32(gz->mtime, &buf[4]);
1959
- buf[8] = extraflags;
1960
- buf[9] = gz->os_code;
1961
- zstream_append_buffer(&gz->z, buf, sizeof(buf));
1962
-
1963
- if (!NIL_P(gz->orig_name)) {
1964
- zstream_append_buffer2(&gz->z, gz->orig_name);
1965
- zstream_append_buffer(&gz->z, "\0", 1);
1966
- }
1967
- if (!NIL_P(gz->comment)) {
1968
- zstream_append_buffer2(&gz->z, gz->comment);
1969
- zstream_append_buffer(&gz->z, "\0", 1);
1970
- }
1971
-
1972
- gz->z.flags |= GZFILE_FLAG_HEADER_FINISHED;
1973
- }
1974
-
1975
- static void
1976
- gzfile_make_footer(gz)
1977
- struct gzfile *gz;
1978
- {
1979
- unsigned char buf[8]; /* 8 is the size of gzip footer */
1980
-
1981
- gzfile_set32(gz->crc, buf);
1982
- gzfile_set32(gz->z.stream.total_in, &buf[4]);
1983
- zstream_append_buffer(&gz->z, buf, sizeof(buf));
1984
- gz->z.flags |= GZFILE_FLAG_FOOTER_FINISHED;
1985
- }
1986
-
1987
- static void
1988
- gzfile_read_header(gz)
1989
- struct gzfile *gz;
1990
- {
1991
- const unsigned char *head;
1992
- long len;
1993
- char flags, *p;
1994
-
1995
- if (!gzfile_read_raw_ensure(gz, 10)) { /* 10 is the size of gzip header */
1996
- rb_raise(cGzError, "not in gzip format");
1997
- }
1998
-
1999
- head = RSTRING(gz->z.input)->ptr;
2000
-
2001
- if (head[0] != GZ_MAGIC1 || head[1] != GZ_MAGIC2) {
2002
- rb_raise(cGzError, "not in gzip format");
2003
- }
2004
- if (head[2] != GZ_METHOD_DEFLATE) {
2005
- rb_raise(cGzError, "unsupported compression method %d", head[2]);
2006
- }
2007
-
2008
- flags = head[3];
2009
- if (flags & GZ_FLAG_MULTIPART) {
2010
- rb_raise(cGzError, "multi-part gzip file is not supported");
2011
- }
2012
- else if (flags & GZ_FLAG_ENCRYPT) {
2013
- rb_raise(cGzError, "encrypted gzip file is not supported");
2014
- }
2015
- else if (flags & GZ_FLAG_UNKNOWN_MASK) {
2016
- rb_raise(cGzError, "unknown flags 0x%02x", flags);
2017
- }
2018
-
2019
- if (head[8] & GZ_EXTRAFLAG_FAST) {
2020
- gz->level = Z_BEST_SPEED;
2021
- }
2022
- else if (head[8] & GZ_EXTRAFLAG_SLOW) {
2023
- gz->level = Z_BEST_COMPRESSION;
2024
- }
2025
- else {
2026
- gz->level = Z_DEFAULT_COMPRESSION;
2027
- }
2028
-
2029
- gz->mtime = gzfile_get32(&head[4]);
2030
- gz->os_code = head[9];
2031
- zstream_discard_input(&gz->z, 10);
2032
-
2033
- if (flags & GZ_FLAG_EXTRA) {
2034
- if (!gzfile_read_raw_ensure(gz, 2)) {
2035
- rb_raise(cGzError, "unexpected end of file");
2036
- }
2037
- len = gzfile_get16(RSTRING(gz->z.input)->ptr);
2038
- if (!gzfile_read_raw_ensure(gz, 2 + len)) {
2039
- rb_raise(cGzError, "unexpected end of file");
2040
- }
2041
- zstream_discard_input(&gz->z, 2 + len);
2042
- }
2043
- if (flags & GZ_FLAG_ORIG_NAME) {
2044
- p = gzfile_read_raw_until_zero(gz, 0);
2045
- len = p - RSTRING(gz->z.input)->ptr;
2046
- gz->orig_name = rb_str_new(RSTRING(gz->z.input)->ptr, len);
2047
- OBJ_TAINT(gz->orig_name); /* for safe */
2048
- zstream_discard_input(&gz->z, len + 1);
2049
- }
2050
- if (flags & GZ_FLAG_COMMENT) {
2051
- p = gzfile_read_raw_until_zero(gz, 0);
2052
- len = p - RSTRING(gz->z.input)->ptr;
2053
- gz->comment = rb_str_new(RSTRING(gz->z.input)->ptr, len);
2054
- OBJ_TAINT(gz->comment); /* for safe */
2055
- zstream_discard_input(&gz->z, len + 1);
2056
- }
2057
-
2058
- if (gz->z.input != Qnil && RSTRING(gz->z.input)->len > 0) {
2059
- zstream_run(&gz->z, 0, 0, Z_SYNC_FLUSH);
2060
- }
2061
- }
2062
-
2063
- static void
2064
- gzfile_check_footer(gz)
2065
- struct gzfile *gz;
2066
- {
2067
- unsigned long crc, length;
2068
-
2069
- gz->z.flags |= GZFILE_FLAG_FOOTER_FINISHED;
2070
-
2071
- if (!gzfile_read_raw_ensure(gz, 8)) { /* 8 is the size of gzip footer */
2072
- rb_raise(cNoFooter, "footer is not found");
2073
- }
2074
-
2075
- crc = gzfile_get32(RSTRING(gz->z.input)->ptr);
2076
- length = gzfile_get32(RSTRING(gz->z.input)->ptr + 4);
2077
-
2078
- gz->z.stream.total_in += 8; /* to rewind correctly */
2079
- zstream_discard_input(&gz->z, 8);
2080
-
2081
- if (gz->crc != crc) {
2082
- rb_raise(cCRCError, "invalid compressed data -- crc error");
2083
- }
2084
- if (gz->z.stream.total_out != length) {
2085
- rb_raise(cLengthError, "invalid compressed data -- length error");
2086
- }
2087
- }
2088
-
2089
- static void
2090
- gzfile_write(gz, str, len)
2091
- struct gzfile *gz;
2092
- Bytef *str;
2093
- uInt len;
2094
- {
2095
- if (!(gz->z.flags & GZFILE_FLAG_HEADER_FINISHED)) {
2096
- gzfile_make_header(gz);
2097
- }
2098
-
2099
- if (len > 0 || (gz->z.flags & GZFILE_FLAG_SYNC)) {
2100
- gz->crc = crc32(gz->crc, str, len);
2101
- zstream_run(&gz->z, str, len, (gz->z.flags & GZFILE_FLAG_SYNC)
2102
- ? Z_SYNC_FLUSH : Z_NO_FLUSH);
2103
- }
2104
- gzfile_write_raw(gz);
2105
- }
2106
-
2107
- static long
2108
- gzfile_read_more(gz)
2109
- struct gzfile *gz;
2110
- {
2111
- volatile VALUE str;
2112
-
2113
- while (!ZSTREAM_IS_FINISHED(&gz->z)) {
2114
- str = gzfile_read_raw(gz);
2115
- if (NIL_P(str)) {
2116
- if (!ZSTREAM_IS_FINISHED(&gz->z)) {
2117
- rb_raise(cGzError, "unexpected end of file");
2118
- }
2119
- break;
2120
- }
2121
- if (RSTRING(str)->len > 0) { /* prevent Z_BUF_ERROR */
2122
- zstream_run(&gz->z, RSTRING(str)->ptr, RSTRING(str)->len,
2123
- Z_SYNC_FLUSH);
2124
- }
2125
- if (gz->z.buf_filled > 0) break;
2126
- }
2127
- return gz->z.buf_filled;
2128
- }
2129
-
2130
- static void
2131
- gzfile_calc_crc(gz, str)
2132
- struct gzfile *gz;
2133
- VALUE str;
2134
- {
2135
- if (RSTRING(str)->len <= gz->ungetc) {
2136
- gz->ungetc -= RSTRING(str)->len;
2137
- }
2138
- else {
2139
- gz->crc = crc32(gz->crc, RSTRING(str)->ptr + gz->ungetc,
2140
- RSTRING(str)->len - gz->ungetc);
2141
- gz->ungetc = 0;
2142
- }
2143
- }
2144
-
2145
- static VALUE
2146
- gzfile_read(gz, len)
2147
- struct gzfile *gz;
2148
- int len;
2149
- {
2150
- VALUE dst;
2151
-
2152
- if (len < 0)
2153
- rb_raise(rb_eArgError, "negative length %d given", len);
2154
- if (len == 0)
2155
- return rb_str_new(0, 0);
2156
- while (!ZSTREAM_IS_FINISHED(&gz->z) && gz->z.buf_filled < len) {
2157
- gzfile_read_more(gz);
2158
- }
2159
- if (GZFILE_IS_FINISHED(gz)) {
2160
- if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2161
- gzfile_check_footer(gz);
2162
- }
2163
- return Qnil;
2164
- }
2165
-
2166
- dst = zstream_shift_buffer(&gz->z, len);
2167
- gzfile_calc_crc(gz, dst);
2168
-
2169
- OBJ_TAINT(dst); /* for safe */
2170
- return dst;
2171
- }
2172
-
2173
- static VALUE
2174
- gzfile_read_all(gz)
2175
- struct gzfile *gz;
2176
- {
2177
- VALUE dst;
2178
-
2179
- while (!ZSTREAM_IS_FINISHED(&gz->z)) {
2180
- gzfile_read_more(gz);
2181
- }
2182
- if (GZFILE_IS_FINISHED(gz)) {
2183
- if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2184
- gzfile_check_footer(gz);
2185
- }
2186
- return rb_str_new(0, 0);
2187
- }
2188
-
2189
- dst = zstream_detach_buffer(&gz->z);
2190
- gzfile_calc_crc(gz, dst);
2191
-
2192
- OBJ_TAINT(dst); /* for safe */
2193
- return dst;
2194
- }
2195
-
2196
- static void
2197
- gzfile_ungetc(gz, c)
2198
- struct gzfile *gz;
2199
- int c;
2200
- {
2201
- zstream_buffer_ungetc(&gz->z, c);
2202
- gz->ungetc++;
2203
- }
2204
-
2205
- static VALUE
2206
- gzfile_writer_end_run(arg)
2207
- VALUE arg;
2208
- {
2209
- struct gzfile *gz = (struct gzfile *)arg;
2210
-
2211
- if (!(gz->z.flags & GZFILE_FLAG_HEADER_FINISHED)) {
2212
- gzfile_make_header(gz);
2213
- }
2214
-
2215
- zstream_run(&gz->z, "", 0, Z_FINISH);
2216
- gzfile_make_footer(gz);
2217
- gzfile_write_raw(gz);
2218
-
2219
- return Qnil;
2220
- }
2221
-
2222
- static void
2223
- gzfile_writer_end(gz)
2224
- struct gzfile *gz;
2225
- {
2226
- if (ZSTREAM_IS_CLOSING(&gz->z)) return;
2227
- gz->z.flags |= ZSTREAM_FLAG_CLOSING;
2228
-
2229
- rb_ensure(gzfile_writer_end_run, (VALUE)gz, zstream_end, (VALUE)&gz->z);
2230
- }
2231
-
2232
- static VALUE
2233
- gzfile_reader_end_run(arg)
2234
- VALUE arg;
2235
- {
2236
- struct gzfile *gz = (struct gzfile *)arg;
2237
-
2238
- if (GZFILE_IS_FINISHED(gz)
2239
- && !(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2240
- gzfile_check_footer(gz);
2241
- }
2242
-
2243
- return Qnil;
2244
- }
2245
-
2246
- static void
2247
- gzfile_reader_end(gz)
2248
- struct gzfile *gz;
2249
- {
2250
- if (ZSTREAM_IS_CLOSING(&gz->z)) return;
2251
- gz->z.flags |= ZSTREAM_FLAG_CLOSING;
2252
-
2253
- rb_ensure(gzfile_reader_end_run, (VALUE)gz, zstream_end, (VALUE)&gz->z);
2254
- }
2255
-
2256
- static void
2257
- gzfile_reader_rewind(gz)
2258
- struct gzfile *gz;
2259
- {
2260
- long n;
2261
-
2262
- n = gz->z.stream.total_in;
2263
- if (!NIL_P(gz->z.input)) {
2264
- n += RSTRING(gz->z.input)->len;
2265
- }
2266
-
2267
- rb_funcall(gz->io, id_seek, 2, rb_int2inum(-n), INT2FIX(1));
2268
- gzfile_reset(gz);
2269
- }
2270
-
2271
- static VALUE
2272
- gzfile_reader_get_unused(gz)
2273
- struct gzfile *gz;
2274
- {
2275
- VALUE str;
2276
-
2277
- if (!ZSTREAM_IS_READY(&gz->z)) return Qnil;
2278
- if (!GZFILE_IS_FINISHED(gz)) return Qnil;
2279
- if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2280
- gzfile_check_footer(gz);
2281
- }
2282
- if (NIL_P(gz->z.input)) return Qnil;
2283
-
2284
- str = rb_str_dup(gz->z.input);
2285
- OBJ_TAINT(str); /* for safe */
2286
- return str;
2287
- }
2288
-
2289
- static struct gzfile *
2290
- get_gzfile(obj)
2291
- VALUE obj;
2292
- {
2293
- struct gzfile *gz;
2294
-
2295
- Data_Get_Struct(obj, struct gzfile, gz);
2296
- if (!ZSTREAM_IS_READY(&gz->z)) {
2297
- rb_raise(cGzError, "closed gzip stream");
2298
- }
2299
- return gz;
2300
- }
2301
-
2302
-
2303
- /* ------------------------------------------------------------------------- */
2304
-
2305
- /*
2306
- * Document-class: Zlib::GzipFile
2307
- *
2308
- * Zlib::GzipFile is an abstract class for handling a gzip formatted
2309
- * compressed file. The operations are defined in the subclasses,
2310
- * Zlib::GzipReader for reading, and Zlib::GzipWriter for writing.
2311
- *
2312
- * GzipReader should be used by associating an IO, or IO-like, object.
2313
- */
2314
-
2315
-
2316
- static VALUE
2317
- gzfile_ensure_close(obj)
2318
- VALUE obj;
2319
- {
2320
- struct gzfile *gz;
2321
-
2322
- Data_Get_Struct(obj, struct gzfile, gz);
2323
- if (ZSTREAM_IS_READY(&gz->z)) {
2324
- gzfile_close(gz, 1);
2325
- }
2326
- return Qnil;
2327
- }
2328
-
2329
- /*
2330
- * See Zlib::GzipReader#wrap and Zlib::GzipWriter#wrap.
2331
- */
2332
- static VALUE
2333
- rb_gzfile_s_wrap(argc, argv, klass)
2334
- int argc;
2335
- VALUE *argv;
2336
- VALUE klass;
2337
- {
2338
- VALUE obj = rb_class_new_instance(argc, argv, klass);
2339
-
2340
- if (rb_block_given_p()) {
2341
- return rb_ensure(rb_yield, obj, gzfile_ensure_close, obj);
2342
- }
2343
- else {
2344
- return obj;
2345
- }
2346
- }
2347
-
2348
- /*
2349
- * See Zlib::GzipReader#open and Zlib::GzipWriter#open.
2350
- */
2351
- static VALUE
2352
- gzfile_s_open(argc, argv, klass, mode)
2353
- int argc;
2354
- VALUE *argv;
2355
- VALUE klass;
2356
- const char *mode;
2357
- {
2358
- VALUE io, filename;
2359
-
2360
- if (argc < 1) {
2361
- rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
2362
- }
2363
- filename = argv[0];
2364
- SafeStringValue(filename);
2365
- io = rb_file_open(RSTRING(filename)->ptr, mode);
2366
-
2367
- argv[0] = io;
2368
- return rb_gzfile_s_wrap(argc, argv, klass);
2369
- }
2370
-
2371
- /*
2372
- * Same as IO.
2373
- */
2374
- static VALUE
2375
- rb_gzfile_to_io(obj)
2376
- VALUE obj;
2377
- {
2378
- return get_gzfile(obj)->io;
2379
- }
2380
-
2381
- /*
2382
- * Returns CRC value of the uncompressed data.
2383
- */
2384
- static VALUE
2385
- rb_gzfile_crc(obj)
2386
- VALUE obj;
2387
- {
2388
- return rb_uint2inum(get_gzfile(obj)->crc);
2389
- }
2390
-
2391
- /*
2392
- * Returns last modification time recorded in the gzip file header.
2393
- */
2394
- static VALUE
2395
- rb_gzfile_mtime(obj)
2396
- VALUE obj;
2397
- {
2398
- return rb_time_new(get_gzfile(obj)->mtime, (time_t)0);
2399
- }
2400
-
2401
- /*
2402
- * Returns compression level.
2403
- */
2404
- static VALUE
2405
- rb_gzfile_level(obj)
2406
- VALUE obj;
2407
- {
2408
- return INT2FIX(get_gzfile(obj)->level);
2409
- }
2410
-
2411
- /*
2412
- * Returns OS code number recorded in the gzip file header.
2413
- */
2414
- static VALUE
2415
- rb_gzfile_os_code(obj)
2416
- VALUE obj;
2417
- {
2418
- return INT2FIX(get_gzfile(obj)->os_code);
2419
- }
2420
-
2421
- /*
2422
- * Returns original filename recorded in the gzip file header, or +nil+ if
2423
- * original filename is not present.
2424
- */
2425
- static VALUE
2426
- rb_gzfile_orig_name(obj)
2427
- VALUE obj;
2428
- {
2429
- VALUE str = get_gzfile(obj)->orig_name;
2430
- if (!NIL_P(str)) {
2431
- str = rb_str_dup(str);
2432
- }
2433
- OBJ_TAINT(str); /* for safe */
2434
- return str;
2435
- }
2436
-
2437
- /*
2438
- * Returns comments recorded in the gzip file header, or nil if the comments
2439
- * is not present.
2440
- */
2441
- static VALUE
2442
- rb_gzfile_comment(obj)
2443
- VALUE obj;
2444
- {
2445
- VALUE str = get_gzfile(obj)->comment;
2446
- if (!NIL_P(str)) {
2447
- str = rb_str_dup(str);
2448
- }
2449
- OBJ_TAINT(str); /* for safe */
2450
- return str;
2451
- }
2452
-
2453
- /*
2454
- * ???
2455
- */
2456
- static VALUE
2457
- rb_gzfile_lineno(obj)
2458
- VALUE obj;
2459
- {
2460
- return INT2NUM(get_gzfile(obj)->lineno);
2461
- }
2462
-
2463
- /*
2464
- * ???
2465
- */
2466
- static VALUE
2467
- rb_gzfile_set_lineno(obj, lineno)
2468
- VALUE obj, lineno;
2469
- {
2470
- struct gzfile *gz = get_gzfile(obj);
2471
- gz->lineno = NUM2INT(lineno);
2472
- return lineno;
2473
- }
2474
-
2475
- /*
2476
- * ???
2477
- */
2478
- static VALUE
2479
- rb_gzfile_set_mtime(obj, mtime)
2480
- VALUE obj, mtime;
2481
- {
2482
- struct gzfile *gz = get_gzfile(obj);
2483
- VALUE val;
2484
-
2485
- if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
2486
- rb_raise(cGzError, "header is already written");
2487
- }
2488
-
2489
- if (FIXNUM_P(time)) {
2490
- gz->mtime = FIX2INT(mtime);
2491
- }
2492
- else {
2493
- val = rb_Integer(mtime);
2494
- gz->mtime = FIXNUM_P(val) ? FIX2INT(val) : rb_big2ulong(val);
2495
- }
2496
- return mtime;
2497
- }
2498
-
2499
- /*
2500
- * ???
2501
- */
2502
- static VALUE
2503
- rb_gzfile_set_orig_name(obj, str)
2504
- VALUE obj, str;
2505
- {
2506
- struct gzfile *gz = get_gzfile(obj);
2507
- VALUE s;
2508
- char *p;
2509
-
2510
- if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
2511
- rb_raise(cGzError, "header is already written");
2512
- }
2513
- s = rb_str_dup(rb_str_to_str(str));
2514
- p = memchr(RSTRING(s)->ptr, '\0', RSTRING(s)->len);
2515
- if (p) {
2516
- rb_str_resize(s, p - RSTRING(s)->ptr);
2517
- }
2518
- gz->orig_name = s;
2519
- return str;
2520
- }
2521
-
2522
- /*
2523
- * ???
2524
- */
2525
- static VALUE
2526
- rb_gzfile_set_comment(obj, str)
2527
- VALUE obj, str;
2528
- {
2529
- struct gzfile *gz = get_gzfile(obj);
2530
- VALUE s;
2531
- char *p;
2532
-
2533
- if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
2534
- rb_raise(cGzError, "header is already written");
2535
- }
2536
- s = rb_str_dup(rb_str_to_str(str));
2537
- p = memchr(RSTRING(s)->ptr, '\0', RSTRING(s)->len);
2538
- if (p) {
2539
- rb_str_resize(s, p - RSTRING(s)->ptr);
2540
- }
2541
- gz->comment = s;
2542
- return str;
2543
- }
2544
-
2545
- /*
2546
- * Closes the GzipFile object. This method calls close method of the
2547
- * associated IO object. Returns the associated IO object.
2548
- */
2549
- static VALUE
2550
- rb_gzfile_close(obj)
2551
- VALUE obj;
2552
- {
2553
- struct gzfile *gz = get_gzfile(obj);
2554
- VALUE io;
2555
-
2556
- io = gz->io;
2557
- gzfile_close(gz, 1);
2558
- return io;
2559
- }
2560
-
2561
- /*
2562
- * Closes the GzipFile object. Unlike Zlib::GzipFile#close, this method never
2563
- * calls the close method of the associated IO object. Returns the associated IO
2564
- * object.
2565
- */
2566
- static VALUE
2567
- rb_gzfile_finish(obj)
2568
- VALUE obj;
2569
- {
2570
- struct gzfile *gz = get_gzfile(obj);
2571
- VALUE io;
2572
-
2573
- io = gz->io;
2574
- gzfile_close(gz, 0);
2575
- return io;
2576
- }
2577
-
2578
- /*
2579
- * Same as IO.
2580
- */
2581
- static VALUE
2582
- rb_gzfile_closed_p(obj)
2583
- VALUE obj;
2584
- {
2585
- struct gzfile *gz;
2586
- Data_Get_Struct(obj, struct gzfile, gz);
2587
- return NIL_P(gz->io) ? Qtrue : Qfalse;
2588
- }
2589
-
2590
- /*
2591
- * ???
2592
- */
2593
- static VALUE
2594
- rb_gzfile_eof_p(obj)
2595
- VALUE obj;
2596
- {
2597
- struct gzfile *gz = get_gzfile(obj);
2598
- return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
2599
- }
2600
-
2601
- /*
2602
- * Same as IO.
2603
- */
2604
- static VALUE
2605
- rb_gzfile_sync(obj)
2606
- VALUE obj;
2607
- {
2608
- return (get_gzfile(obj)->z.flags & GZFILE_FLAG_SYNC) ? Qtrue : Qfalse;
2609
- }
2610
-
2611
- /*
2612
- * call-seq: sync = flag
2613
- *
2614
- * Same as IO. If flag is +true+, the associated IO object must respond to the
2615
- * +flush+ method. While +sync+ mode is +true+, the compression ratio
2616
- * decreases sharply.
2617
- */
2618
- static VALUE
2619
- rb_gzfile_set_sync(obj, mode)
2620
- VALUE obj, mode;
2621
- {
2622
- struct gzfile *gz = get_gzfile(obj);
2623
-
2624
- if (RTEST(mode)) {
2625
- gz->z.flags |= GZFILE_FLAG_SYNC;
2626
- }
2627
- else {
2628
- gz->z.flags &= ~GZFILE_FLAG_SYNC;
2629
- }
2630
- return mode;
2631
- }
2632
-
2633
- /*
2634
- * ???
2635
- */
2636
- static VALUE
2637
- rb_gzfile_total_in(obj)
2638
- VALUE obj;
2639
- {
2640
- return rb_uint2inum(get_gzfile(obj)->z.stream.total_in);
2641
- }
2642
-
2643
- /*
2644
- * ???
2645
- */
2646
- static VALUE
2647
- rb_gzfile_total_out(obj)
2648
- VALUE obj;
2649
- {
2650
- struct gzfile *gz = get_gzfile(obj);
2651
- return rb_uint2inum(gz->z.stream.total_out - gz->z.buf_filled);
2652
- }
2653
-
2654
-
2655
- /* ------------------------------------------------------------------------- */
2656
-
2657
- /*
2658
- * Document-class: Zlib::GzipWriter
2659
- *
2660
- * Zlib::GzipWriter is a class for writing gzipped files. GzipWriter should
2661
- * be used with an instance of IO, or IO-like, object.
2662
- *
2663
- * For example:
2664
- *
2665
- * Zlib::GzipWriter.open('hoge.gz') do |gz|
2666
- * gz.write 'jugemu jugemu gokou no surikire...'
2667
- * end
2668
- *
2669
- * File.open('hoge.gz', 'w') do |f|
2670
- * gz = Zlib::GzipWriter.new(f)
2671
- * gz.write 'jugemu jugemu gokou no surikire...'
2672
- * gz.close
2673
- * end
2674
- *
2675
- * # TODO: test these. Are they equivalent? Can GzipWriter.new take a
2676
- * # block?
2677
- *
2678
- * NOTE: Due to the limitation of Ruby's finalizer, you must explicitly close
2679
- * GzipWriter objects by Zlib::GzipWriter#close etc. Otherwise, GzipWriter
2680
- * will be not able to write the gzip footer and will generate a broken gzip
2681
- * file.
2682
- */
2683
-
2684
- static VALUE
2685
- rb_gzwriter_s_allocate(klass)
2686
- VALUE klass;
2687
- {
2688
- return gzfile_writer_new(klass);
2689
- }
2690
-
2691
- /*
2692
- * call-seq: Zlib::GzipWriter.open(filename, level=nil, strategy=nil) { |gz| ... }
2693
- *
2694
- * Opens a file specified by +filename+ for writing gzip compressed data, and
2695
- * returns a GzipWriter object associated with that file. Further details of
2696
- * this method are found in Zlib::GzipWriter.new and Zlib::GzipWriter#wrap.
2697
- */
2698
- static VALUE
2699
- rb_gzwriter_s_open(argc, argv, klass)
2700
- int argc;
2701
- VALUE *argv;
2702
- VALUE klass;
2703
- {
2704
- return gzfile_s_open(argc, argv, klass, "wb");
2705
- }
2706
-
2707
- /*
2708
- * call-seq: Zlib::GzipWriter.new(io, level, strategy)
2709
- *
2710
- * Creates a GzipWriter object associated with +io+. +level+ and +strategy+
2711
- * should be the same as the arguments of Zlib::Deflate.new. The GzipWriter
2712
- * object writes gzipped data to +io+. At least, +io+ must respond to the
2713
- * +write+ method that behaves same as write method in IO class.
2714
- */
2715
- static VALUE
2716
- rb_gzwriter_initialize(argc, argv, obj)
2717
- int argc;
2718
- VALUE *argv;
2719
- VALUE obj;
2720
- {
2721
- struct gzfile *gz;
2722
- VALUE io, level, strategy;
2723
- int err;
2724
-
2725
- rb_scan_args(argc, argv, "12", &io, &level, &strategy);
2726
- Data_Get_Struct(obj, struct gzfile, gz);
2727
-
2728
- /* this is undocumented feature of zlib */
2729
- gz->level = ARG_LEVEL(level);
2730
- err = deflateInit2(&gz->z.stream, gz->level, Z_DEFLATED,
2731
- -MAX_WBITS, DEF_MEM_LEVEL, ARG_STRATEGY(strategy));
2732
- if (err != Z_OK) {
2733
- raise_zlib_error(err, gz->z.stream.msg);
2734
- }
2735
- gz->io = io;
2736
- ZSTREAM_READY(&gz->z);
2737
-
2738
- return obj;
2739
- }
2740
-
2741
- /*
2742
- * call-seq: flush(flush=nil)
2743
- *
2744
- * Flushes all the internal buffers of the GzipWriter object. The meaning of
2745
- * +flush+ is same as in Zlib::Deflate#deflate. <tt>Zlib::SYNC_FLUSH</tt> is used if
2746
- * +flush+ is omitted. It is no use giving flush <tt>Zlib::NO_FLUSH</tt>.
2747
- */
2748
- static VALUE
2749
- rb_gzwriter_flush(argc, argv, obj)
2750
- int argc;
2751
- VALUE *argv;
2752
- VALUE obj;
2753
- {
2754
- struct gzfile *gz = get_gzfile(obj);
2755
- VALUE v_flush;
2756
- int flush;
2757
-
2758
- rb_scan_args(argc, argv, "01", &v_flush);
2759
-
2760
- flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
2761
- if (flush != Z_NO_FLUSH) { /* prevent Z_BUF_ERROR */
2762
- zstream_run(&gz->z, "", 0, flush);
2763
- }
2764
-
2765
- gzfile_write_raw(gz);
2766
- if (rb_respond_to(gz->io, id_flush)) {
2767
- rb_funcall(gz->io, id_flush, 0);
2768
- }
2769
- return obj;
2770
- }
2771
-
2772
- /*
2773
- * Same as IO.
2774
- */
2775
- static VALUE
2776
- rb_gzwriter_write(obj, str)
2777
- VALUE obj, str;
2778
- {
2779
- struct gzfile *gz = get_gzfile(obj);
2780
-
2781
- if (TYPE(str) != T_STRING) {
2782
- str = rb_obj_as_string(str);
2783
- }
2784
- gzfile_write(gz, RSTRING(str)->ptr, RSTRING(str)->len);
2785
- return INT2FIX(RSTRING(str)->len);
2786
- }
2787
-
2788
- /*
2789
- * Same as IO.
2790
- */
2791
- static VALUE
2792
- rb_gzwriter_putc(obj, ch)
2793
- VALUE obj, ch;
2794
- {
2795
- struct gzfile *gz = get_gzfile(obj);
2796
- char c = NUM2CHR(ch);
2797
-
2798
- gzfile_write(gz, &c, 1);
2799
- return ch;
2800
- }
2801
-
2802
-
2803
-
2804
- /*
2805
- * Document-method: <<
2806
- * Same as IO.
2807
- */
2808
- #define rb_gzwriter_addstr rb_io_addstr
2809
- /*
2810
- * Document-method: printf
2811
- * Same as IO.
2812
- */
2813
- #define rb_gzwriter_printf rb_io_printf
2814
- /*
2815
- * Document-method: print
2816
- * Same as IO.
2817
- */
2818
- #define rb_gzwriter_print rb_io_print
2819
- /*
2820
- * Document-method: puts
2821
- * Same as IO.
2822
- */
2823
- #define rb_gzwriter_puts rb_io_puts
2824
-
2825
-
2826
- /* ------------------------------------------------------------------------- */
2827
-
2828
- /*
2829
- * Document-class: Zlib::GzipReader
2830
- *
2831
- * Zlib::GzipReader is the class for reading a gzipped file. GzipReader should
2832
- * be used an IO, or -IO-lie, object.
2833
- *
2834
- * Zlib::GzipReader.open('hoge.gz') {|gz|
2835
- * print gz.read
2836
- * }
2837
- *
2838
- * File.open('hoge.gz') do |f|
2839
- * gz = Zlib::GzipReader.new(f)
2840
- * print gz.read
2841
- * gz.close
2842
- * end
2843
- *
2844
- * # TODO: test these. Are they equivalent? Can GzipReader.new take a
2845
- * # block?
2846
- *
2847
- * == Method Catalogue
2848
- *
2849
- * The following methods in Zlib::GzipReader are just like their counterparts
2850
- * in IO, but they raise Zlib::Error or Zlib::GzipFile::Error exception if an
2851
- * error was found in the gzip file.
2852
- * - #each
2853
- * - #each_line
2854
- * - #each_byte
2855
- * - #gets
2856
- * - #getc
2857
- * - #lineno
2858
- * - #lineno=
2859
- * - #read
2860
- * - #readchar
2861
- * - #readline
2862
- * - #readlines
2863
- * - #ungetc
2864
- *
2865
- * Be careful of the footer of the gzip file. A gzip file has the checksum of
2866
- * pre-compressed data in its footer. GzipReader checks all uncompressed data
2867
- * against that checksum at the following cases, and if it fails, raises
2868
- * <tt>Zlib::GzipFile::NoFooter</tt>, <tt>Zlib::GzipFile::CRCError</tt>, or
2869
- * <tt>Zlib::GzipFile::LengthError</tt> exception.
2870
- *
2871
- * - When an reading request is received beyond the end of file (the end of
2872
- * compressed data). That is, when Zlib::GzipReader#read,
2873
- * Zlib::GzipReader#gets, or some other methods for reading returns nil.
2874
- * - When Zlib::GzipFile#close method is called after the object reaches the
2875
- * end of file.
2876
- * - When Zlib::GzipReader#unused method is called after the object reaches
2877
- * the end of file.
2878
- *
2879
- * The rest of the methods are adequately described in their own
2880
- * documentation.
2881
- */
2882
-
2883
- static VALUE
2884
- rb_gzreader_s_allocate(klass)
2885
- VALUE klass;
2886
- {
2887
- return gzfile_reader_new(klass);
2888
- }
2889
-
2890
- /*
2891
- * call-seq: Zlib::GzipReader.open(filename) {|gz| ... }
2892
- *
2893
- * Opens a file specified by +filename+ as a gzipped file, and returns a
2894
- * GzipReader object associated with that file. Further details of this method
2895
- * are in Zlib::GzipReader.new and ZLib::GzipReader.wrap.
2896
- */
2897
- static VALUE
2898
- rb_gzreader_s_open(argc, argv, klass)
2899
- int argc;
2900
- VALUE *argv;
2901
- VALUE klass;
2902
- {
2903
- return gzfile_s_open(argc, argv, klass, "rb");
2904
- }
2905
-
2906
- /*
2907
- * call-seq: Zlib::GzipReader.new(io)
2908
- *
2909
- * Creates a GzipReader object associated with +io+. The GzipReader object reads
2910
- * gzipped data from +io+, and parses/decompresses them. At least, +io+ must have
2911
- * a +read+ method that behaves same as the +read+ method in IO class.
2912
- *
2913
- * If the gzip file header is incorrect, raises an Zlib::GzipFile::Error
2914
- * exception.
2915
- */
2916
- static VALUE
2917
- rb_gzreader_initialize(obj, io)
2918
- VALUE obj, io;
2919
- {
2920
- struct gzfile *gz;
2921
- int err;
2922
-
2923
- Data_Get_Struct(obj, struct gzfile, gz);
2924
-
2925
- /* this is undocumented feature of zlib */
2926
- err = inflateInit2(&gz->z.stream, -MAX_WBITS);
2927
- if (err != Z_OK) {
2928
- raise_zlib_error(err, gz->z.stream.msg);
2929
- }
2930
- gz->io = io;
2931
- ZSTREAM_READY(&gz->z);
2932
- gzfile_read_header(gz);
2933
-
2934
- return obj;
2935
- }
2936
-
2937
- /*
2938
- * Resets the position of the file pointer to the point created the GzipReader
2939
- * object. The associated IO object needs to respond to the +seek+ method.
2940
- */
2941
- static VALUE
2942
- rb_gzreader_rewind(obj)
2943
- VALUE obj;
2944
- {
2945
- struct gzfile *gz = get_gzfile(obj);
2946
- gzfile_reader_rewind(gz);
2947
- return INT2FIX(0);
2948
- }
2949
-
2950
- /*
2951
- * Returns the rest of the data which had read for parsing gzip format, or
2952
- * +nil+ if the whole gzip file is not parsed yet.
2953
- */
2954
- static VALUE
2955
- rb_gzreader_unused(obj)
2956
- VALUE obj;
2957
- {
2958
- struct gzfile *gz;
2959
- Data_Get_Struct(obj, struct gzfile, gz);
2960
- return gzfile_reader_get_unused(gz);
2961
- }
2962
-
2963
- /*
2964
- * See Zlib::GzipReader documentation for a description.
2965
- */
2966
- static VALUE
2967
- rb_gzreader_read(argc, argv, obj)
2968
- int argc;
2969
- VALUE *argv;
2970
- VALUE obj;
2971
- {
2972
- struct gzfile *gz = get_gzfile(obj);
2973
- VALUE vlen;
2974
- int len;
2975
-
2976
- rb_scan_args(argc, argv, "01", &vlen);
2977
- if (NIL_P(vlen)) {
2978
- return gzfile_read_all(gz);
2979
- }
2980
-
2981
- len = NUM2INT(vlen);
2982
- if (len < 0) {
2983
- rb_raise(rb_eArgError, "negative length %d given", len);
2984
- }
2985
- return gzfile_read(gz, len);
2986
- }
2987
-
2988
- /*
2989
- * See Zlib::GzipReader documentation for a description.
2990
- */
2991
- static VALUE
2992
- rb_gzreader_getc(obj)
2993
- VALUE obj;
2994
- {
2995
- struct gzfile *gz = get_gzfile(obj);
2996
- VALUE dst;
2997
-
2998
- dst = gzfile_read(gz, 1);
2999
- if (!NIL_P(dst)) {
3000
- dst = INT2FIX((unsigned int)(RSTRING(dst)->ptr[0]) & 0xff);
3001
- }
3002
- return dst;
3003
- }
3004
-
3005
- /*
3006
- * See Zlib::GzipReader documentation for a description.
3007
- */
3008
- static VALUE
3009
- rb_gzreader_readchar(obj)
3010
- VALUE obj;
3011
- {
3012
- VALUE dst;
3013
- dst = rb_gzreader_getc(obj);
3014
- if (NIL_P(dst)) {
3015
- rb_raise(rb_eEOFError, "end of file reached");
3016
- }
3017
- return dst;
3018
- }
3019
-
3020
- /*
3021
- * See Zlib::GzipReader documentation for a description.
3022
- */
3023
- static VALUE
3024
- rb_gzreader_each_byte(obj)
3025
- VALUE obj;
3026
- {
3027
- VALUE c;
3028
- while (!NIL_P(c = rb_gzreader_getc(obj))) {
3029
- rb_yield(c);
3030
- }
3031
- return Qnil;
3032
- }
3033
-
3034
- /*
3035
- * See Zlib::GzipReader documentation for a description.
3036
- */
3037
- static VALUE
3038
- rb_gzreader_ungetc(obj, ch)
3039
- VALUE obj, ch;
3040
- {
3041
- struct gzfile *gz = get_gzfile(obj);
3042
- gzfile_ungetc(gz, NUM2CHR(ch));
3043
- return Qnil;
3044
- }
3045
-
3046
- static void
3047
- gzreader_skip_linebreaks(gz)
3048
- struct gzfile *gz;
3049
- {
3050
- VALUE str;
3051
- char *p;
3052
- int n;
3053
-
3054
- while (gz->z.buf_filled == 0) {
3055
- if (GZFILE_IS_FINISHED(gz)) return;
3056
- gzfile_read_more(gz);
3057
- }
3058
- n = 0;
3059
- p = RSTRING(gz->z.buf)->ptr;
3060
-
3061
- while (n++, *(p++) == '\n') {
3062
- if (n >= gz->z.buf_filled) {
3063
- str = zstream_detach_buffer(&gz->z);
3064
- gzfile_calc_crc(gz, str);
3065
- while (gz->z.buf_filled == 0) {
3066
- if (GZFILE_IS_FINISHED(gz)) return;
3067
- gzfile_read_more(gz);
3068
- }
3069
- n = 0;
3070
- p = RSTRING(gz->z.buf)->ptr;
3071
- }
3072
- }
3073
-
3074
- str = zstream_shift_buffer(&gz->z, n - 1);
3075
- gzfile_calc_crc(gz, str);
3076
- }
3077
-
3078
- static void
3079
- rscheck(rsptr, rslen, rs)
3080
- char *rsptr;
3081
- long rslen;
3082
- VALUE rs;
3083
- {
3084
- if (RSTRING(rs)->ptr != rsptr && RSTRING(rs)->len != rslen)
3085
- rb_raise(rb_eRuntimeError, "rs modified");
3086
- }
3087
-
3088
- static VALUE
3089
- gzreader_gets(argc, argv, obj)
3090
- int argc;
3091
- VALUE *argv;
3092
- VALUE obj;
3093
- {
3094
- struct gzfile *gz = get_gzfile(obj);
3095
- volatile VALUE rs;
3096
- VALUE dst;
3097
- char *rsptr, *p, *res;
3098
- long rslen, n;
3099
- int rspara;
3100
-
3101
- if (argc == 0) {
3102
- rs = rb_rs;
3103
- }
3104
- else {
3105
- rb_scan_args(argc, argv, "1", &rs);
3106
- if (!NIL_P(rs)) {
3107
- Check_Type(rs, T_STRING);
3108
- }
3109
- }
3110
-
3111
- if (NIL_P(rs)) {
3112
- dst = gzfile_read_all(gz);
3113
- if (RSTRING(dst)->len != 0) gz->lineno++;
3114
- return dst;
3115
- }
3116
-
3117
- if (RSTRING(rs)->len == 0) {
3118
- rsptr = "\n\n";
3119
- rslen = 2;
3120
- rspara = 1;
3121
- } else {
3122
- rsptr = RSTRING(rs)->ptr;
3123
- rslen = RSTRING(rs)->len;
3124
- rspara = 0;
3125
- }
3126
-
3127
- if (rspara) {
3128
- gzreader_skip_linebreaks(gz);
3129
- }
3130
-
3131
- while (gz->z.buf_filled < rslen) {
3132
- if (ZSTREAM_IS_FINISHED(&gz->z)) {
3133
- if (gz->z.buf_filled > 0) gz->lineno++;
3134
- return gzfile_read(gz, rslen);
3135
- }
3136
- gzfile_read_more(gz);
3137
- }
3138
-
3139
- p = RSTRING(gz->z.buf)->ptr;
3140
- n = rslen;
3141
- for (;;) {
3142
- if (n > gz->z.buf_filled) {
3143
- if (ZSTREAM_IS_FINISHED(&gz->z)) break;
3144
- gzfile_read_more(gz);
3145
- p = RSTRING(gz->z.buf)->ptr + n - rslen;
3146
- }
3147
- if (!rspara) rscheck(rsptr, rslen, rs);
3148
- res = memchr(p, rsptr[0], (gz->z.buf_filled - n + 1));
3149
- if (!res) {
3150
- n = gz->z.buf_filled + 1;
3151
- } else {
3152
- n += (long)(res - p);
3153
- p = res;
3154
- if (rslen == 1 || memcmp(p, rsptr, rslen) == 0) break;
3155
- p++, n++;
3156
- }
3157
- }
3158
-
3159
- gz->lineno++;
3160
- dst = gzfile_read(gz, n);
3161
- if (rspara) {
3162
- gzreader_skip_linebreaks(gz);
3163
- }
3164
-
3165
- return dst;
3166
- }
3167
-
3168
- /*
3169
- * See Zlib::GzipReader documentation for a description.
3170
- */
3171
- static VALUE
3172
- rb_gzreader_gets(argc, argv, obj)
3173
- int argc;
3174
- VALUE *argv;
3175
- VALUE obj;
3176
- {
3177
- VALUE dst;
3178
- dst = gzreader_gets(argc, argv, obj);
3179
- if (!NIL_P(dst)) {
3180
- rb_lastline_set(dst);
3181
- }
3182
- return dst;
3183
- }
3184
-
3185
- /*
3186
- * See Zlib::GzipReader documentation for a description.
3187
- */
3188
- static VALUE
3189
- rb_gzreader_readline(argc, argv, obj)
3190
- int argc;
3191
- VALUE *argv;
3192
- VALUE obj;
3193
- {
3194
- VALUE dst;
3195
- dst = rb_gzreader_gets(argc, argv, obj);
3196
- if (NIL_P(dst)) {
3197
- rb_raise(rb_eEOFError, "end of file reached");
3198
- }
3199
- return dst;
3200
- }
3201
-
3202
- /*
3203
- * See Zlib::GzipReader documentation for a description.
3204
- */
3205
- static VALUE
3206
- rb_gzreader_each(argc, argv, obj)
3207
- int argc;
3208
- VALUE *argv;
3209
- VALUE obj;
3210
- {
3211
- VALUE str;
3212
- while (!NIL_P(str = gzreader_gets(argc, argv, obj))) {
3213
- rb_yield(str);
3214
- }
3215
- return obj;
3216
- }
3217
-
3218
- /*
3219
- * See Zlib::GzipReader documentation for a description.
3220
- */
3221
- static VALUE
3222
- rb_gzreader_readlines(argc, argv, obj)
3223
- int argc;
3224
- VALUE *argv;
3225
- VALUE obj;
3226
- {
3227
- VALUE str, dst;
3228
- dst = rb_ary_new();
3229
- while (!NIL_P(str = gzreader_gets(argc, argv, obj))) {
3230
- rb_ary_push(dst, str);
3231
- }
3232
- return dst;
3233
- }
3234
-
3235
- #endif /* GZIP_SUPPORT */
3236
-
3237
-
3238
-
3239
- /*
3240
- * The Zlib module contains several classes for compressing and decompressing
3241
- * streams, and for working with "gzip" files.
3242
- *
3243
- * == Classes
3244
- *
3245
- * Following are the classes that are most likely to be of interest to the
3246
- * user:
3247
- * Zlib::Inflate
3248
- * Zlib::Deflate
3249
- * Zlib::GzipReader
3250
- * Zlib::GzipWriter
3251
- *
3252
- * There are two important base classes for the classes above: Zlib::ZStream
3253
- * and Zlib::GzipFile. Everything else is an error class.
3254
- *
3255
- * == Constants
3256
- *
3257
- * Here's a list.
3258
- *
3259
- * Zlib::VERSION
3260
- * The Ruby/zlib version string.
3261
- *
3262
- * Zlib::ZLIB_VERSION
3263
- * The string which represents the version of zlib.h.
3264
- *
3265
- * Zlib::BINARY
3266
- * Zlib::ASCII
3267
- * Zlib::UNKNOWN
3268
- * The integers representing data types which Zlib::ZStream#data_type
3269
- * method returns.
3270
- *
3271
- * Zlib::NO_COMPRESSION
3272
- * Zlib::BEST_SPEED
3273
- * Zlib::BEST_COMPRESSION
3274
- * Zlib::DEFAULT_COMPRESSION
3275
- * The integers representing compression levels which are an argument
3276
- * for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.
3277
- *
3278
- * Zlib::FILTERED
3279
- * Zlib::HUFFMAN_ONLY
3280
- * Zlib::DEFAULT_STRATEGY
3281
- * The integers representing compression methods which are an argument
3282
- * for Zlib::Deflate.new and Zlib::Deflate#params.
3283
- *
3284
- * Zlib::DEF_MEM_LEVEL
3285
- * Zlib::MAX_MEM_LEVEL
3286
- * The integers representing memory levels which are an argument for
3287
- * Zlib::Deflate.new, Zlib::Deflate#params, and so on.
3288
- *
3289
- * Zlib::MAX_WBITS
3290
- * The default value of windowBits which is an argument for
3291
- * Zlib::Deflate.new and Zlib::Inflate.new.
3292
- *
3293
- * Zlib::NO_FLUSH
3294
- * Zlib::SYNC_FLUSH
3295
- * Zlib::FULL_FLUSH
3296
- * Zlib::FINISH
3297
- * The integers to control the output of the deflate stream, which are
3298
- * an argument for Zlib::Deflate#deflate and so on.
3299
- *
3300
- * Zlib::OS_CODE
3301
- * Zlib::OS_MSDOS
3302
- * Zlib::OS_AMIGA
3303
- * Zlib::OS_VMS
3304
- * Zlib::OS_UNIX
3305
- * Zlib::OS_VMCMS
3306
- * Zlib::OS_ATARI
3307
- * Zlib::OS_OS2
3308
- * Zlib::OS_MACOS
3309
- * Zlib::OS_ZSYSTEM
3310
- * Zlib::OS_CPM
3311
- * Zlib::OS_TOPS20
3312
- * Zlib::OS_WIN32
3313
- * Zlib::OS_QDOS
3314
- * Zlib::OS_RISCOS
3315
- * Zlib::OS_UNKNOWN
3316
- * The return values of Zlib::GzipFile#os_code method.
3317
- */
3318
- void Init_zlib()
3319
- {
3320
- VALUE mZlib, cZStream, cDeflate, cInflate;
3321
- #if GZIP_SUPPORT
3322
- VALUE cGzipFile, cGzipWriter, cGzipReader;
3323
- #endif
3324
-
3325
- mZlib = rb_define_module("Zlib");
3326
-
3327
- cZError = rb_define_class_under(mZlib, "Error", rb_eStandardError);
3328
- cStreamEnd = rb_define_class_under(mZlib, "StreamEnd", cZError);
3329
- cNeedDict = rb_define_class_under(mZlib, "NeedDict", cZError);
3330
- cDataError = rb_define_class_under(mZlib, "DataError", cZError);
3331
- cStreamError = rb_define_class_under(mZlib, "StreamError", cZError);
3332
- cMemError = rb_define_class_under(mZlib, "MemError", cZError);
3333
- cBufError = rb_define_class_under(mZlib, "BufError", cZError);
3334
- cVersionError = rb_define_class_under(mZlib, "VersionError", cZError);
3335
-
3336
- rb_define_module_function(mZlib, "zlib_version", rb_zlib_version, 0);
3337
- rb_define_module_function(mZlib, "adler32", rb_zlib_adler32, -1);
3338
- rb_define_module_function(mZlib, "crc32", rb_zlib_crc32, -1);
3339
- rb_define_module_function(mZlib, "crc_table", rb_zlib_crc_table, 0);
3340
-
3341
- rb_define_const(mZlib, "VERSION", rb_str_new2(RUBY_ZLIB_VERSION));
3342
- rb_define_const(mZlib, "ZLIB_VERSION", rb_str_new2(ZLIB_VERSION));
3343
-
3344
- cZStream = rb_define_class_under(mZlib, "ZStream", rb_cObject);
3345
- rb_undef_alloc_func(cZStream);
3346
- rb_define_method(cZStream, "avail_out", rb_zstream_avail_out, 0);
3347
- rb_define_method(cZStream, "avail_out=", rb_zstream_set_avail_out, 1);
3348
- rb_define_method(cZStream, "avail_in", rb_zstream_avail_in, 0);
3349
- rb_define_method(cZStream, "total_in", rb_zstream_total_in, 0);
3350
- rb_define_method(cZStream, "total_out", rb_zstream_total_out, 0);
3351
- rb_define_method(cZStream, "data_type", rb_zstream_data_type, 0);
3352
- rb_define_method(cZStream, "adler", rb_zstream_adler, 0);
3353
- rb_define_method(cZStream, "finished?", rb_zstream_finished_p, 0);
3354
- rb_define_method(cZStream, "stream_end?", rb_zstream_finished_p, 0);
3355
- rb_define_method(cZStream, "closed?", rb_zstream_closed_p, 0);
3356
- rb_define_method(cZStream, "ended?", rb_zstream_closed_p, 0);
3357
- rb_define_method(cZStream, "close", rb_zstream_end, 0);
3358
- rb_define_method(cZStream, "end", rb_zstream_end, 0);
3359
- rb_define_method(cZStream, "reset", rb_zstream_reset, 0);
3360
- rb_define_method(cZStream, "finish", rb_zstream_finish, 0);
3361
- rb_define_method(cZStream, "flush_next_in", rb_zstream_flush_next_in, 0);
3362
- rb_define_method(cZStream, "flush_next_out", rb_zstream_flush_next_out, 0);
3363
-
3364
- rb_define_const(mZlib, "BINARY", INT2FIX(Z_BINARY));
3365
- rb_define_const(mZlib, "ASCII", INT2FIX(Z_ASCII));
3366
- rb_define_const(mZlib, "UNKNOWN", INT2FIX(Z_UNKNOWN));
3367
-
3368
- cDeflate = rb_define_class_under(mZlib, "Deflate", cZStream);
3369
- rb_define_singleton_method(cDeflate, "deflate", rb_deflate_s_deflate, -1);
3370
- rb_define_alloc_func(cDeflate, rb_deflate_s_allocate);
3371
- rb_define_method(cDeflate, "initialize", rb_deflate_initialize, -1);
3372
- rb_define_method(cDeflate, "initialize_copy", rb_deflate_init_copy, 0);
3373
- rb_define_method(cDeflate, "deflate", rb_deflate_deflate, -1);
3374
- rb_define_method(cDeflate, "<<", rb_deflate_addstr, 1);
3375
- rb_define_method(cDeflate, "flush", rb_deflate_flush, -1);
3376
- rb_define_method(cDeflate, "params", rb_deflate_params, 2);
3377
- rb_define_method(cDeflate, "set_dictionary", rb_deflate_set_dictionary, 1);
3378
-
3379
- cInflate = rb_define_class_under(mZlib, "Inflate", cZStream);
3380
- rb_define_singleton_method(cInflate, "inflate", rb_inflate_s_inflate, 1);
3381
- rb_define_alloc_func(cInflate, rb_inflate_s_allocate);
3382
- rb_define_method(cInflate, "initialize", rb_inflate_initialize, -1);
3383
- rb_define_method(cInflate, "inflate", rb_inflate_inflate, 1);
3384
- rb_define_method(cInflate, "<<", rb_inflate_addstr, 1);
3385
- rb_define_method(cInflate, "sync", rb_inflate_sync, 1);
3386
- rb_define_method(cInflate, "sync_point?", rb_inflate_sync_point_p, 0);
3387
- rb_define_method(cInflate, "set_dictionary", rb_inflate_set_dictionary, 1);
3388
-
3389
- rb_define_const(mZlib, "NO_COMPRESSION", INT2FIX(Z_NO_COMPRESSION));
3390
- rb_define_const(mZlib, "BEST_SPEED", INT2FIX(Z_BEST_SPEED));
3391
- rb_define_const(mZlib, "BEST_COMPRESSION", INT2FIX(Z_BEST_COMPRESSION));
3392
- rb_define_const(mZlib, "DEFAULT_COMPRESSION",
3393
- INT2FIX(Z_DEFAULT_COMPRESSION));
3394
-
3395
- rb_define_const(mZlib, "FILTERED", INT2FIX(Z_FILTERED));
3396
- rb_define_const(mZlib, "HUFFMAN_ONLY", INT2FIX(Z_HUFFMAN_ONLY));
3397
- rb_define_const(mZlib, "DEFAULT_STRATEGY", INT2FIX(Z_DEFAULT_STRATEGY));
3398
-
3399
- rb_define_const(mZlib, "MAX_WBITS", INT2FIX(MAX_WBITS));
3400
- rb_define_const(mZlib, "DEF_MEM_LEVEL", INT2FIX(DEF_MEM_LEVEL));
3401
- rb_define_const(mZlib, "MAX_MEM_LEVEL", INT2FIX(MAX_MEM_LEVEL));
3402
-
3403
- rb_define_const(mZlib, "NO_FLUSH", INT2FIX(Z_NO_FLUSH));
3404
- rb_define_const(mZlib, "SYNC_FLUSH", INT2FIX(Z_SYNC_FLUSH));
3405
- rb_define_const(mZlib, "FULL_FLUSH", INT2FIX(Z_FULL_FLUSH));
3406
- rb_define_const(mZlib, "FINISH", INT2FIX(Z_FINISH));
3407
-
3408
- #if GZIP_SUPPORT
3409
- id_write = rb_intern("write");
3410
- id_read = rb_intern("read");
3411
- id_flush = rb_intern("flush");
3412
- id_seek = rb_intern("seek");
3413
- id_close = rb_intern("close");
3414
-
3415
- cGzipFile = rb_define_class_under(mZlib, "GzipFile", rb_cObject);
3416
- cGzError = rb_define_class_under(cGzipFile, "Error", cZError);
3417
-
3418
- cNoFooter = rb_define_class_under(cGzipFile, "NoFooter", cGzError);
3419
- cCRCError = rb_define_class_under(cGzipFile, "CRCError", cGzError);
3420
- cLengthError = rb_define_class_under(cGzipFile,"LengthError",cGzError);
3421
-
3422
- cGzipWriter = rb_define_class_under(mZlib, "GzipWriter", cGzipFile);
3423
- cGzipReader = rb_define_class_under(mZlib, "GzipReader", cGzipFile);
3424
- rb_include_module(cGzipReader, rb_mEnumerable);
3425
-
3426
- rb_define_singleton_method(cGzipFile, "wrap", rb_gzfile_s_wrap, -1);
3427
- rb_undef_alloc_func(cGzipFile);
3428
- rb_define_method(cGzipFile, "to_io", rb_gzfile_to_io, 0);
3429
- rb_define_method(cGzipFile, "crc", rb_gzfile_crc, 0);
3430
- rb_define_method(cGzipFile, "mtime", rb_gzfile_mtime, 0);
3431
- rb_define_method(cGzipFile, "level", rb_gzfile_level, 0);
3432
- rb_define_method(cGzipFile, "os_code", rb_gzfile_os_code, 0);
3433
- rb_define_method(cGzipFile, "orig_name", rb_gzfile_orig_name, 0);
3434
- rb_define_method(cGzipFile, "comment", rb_gzfile_comment, 0);
3435
- rb_define_method(cGzipReader, "lineno", rb_gzfile_lineno, 0);
3436
- rb_define_method(cGzipReader, "lineno=", rb_gzfile_set_lineno, 1);
3437
- rb_define_method(cGzipWriter, "mtime=", rb_gzfile_set_mtime, 1);
3438
- rb_define_method(cGzipWriter, "orig_name=", rb_gzfile_set_orig_name,1);
3439
- rb_define_method(cGzipWriter, "comment=", rb_gzfile_set_comment, 1);
3440
- rb_define_method(cGzipFile, "close", rb_gzfile_close, 0);
3441
- rb_define_method(cGzipFile, "finish", rb_gzfile_finish, 0);
3442
- rb_define_method(cGzipFile, "closed?", rb_gzfile_closed_p, 0);
3443
- rb_define_method(cGzipReader, "eof", rb_gzfile_eof_p, 0);
3444
- rb_define_method(cGzipReader, "eof?", rb_gzfile_eof_p, 0);
3445
- rb_define_method(cGzipFile, "sync", rb_gzfile_sync, 0);
3446
- rb_define_method(cGzipFile, "sync=", rb_gzfile_set_sync, 1);
3447
- rb_define_method(cGzipReader, "pos", rb_gzfile_total_out, 0);
3448
- rb_define_method(cGzipWriter, "pos", rb_gzfile_total_in, 0);
3449
- rb_define_method(cGzipReader, "tell", rb_gzfile_total_out, 0);
3450
- rb_define_method(cGzipWriter, "tell", rb_gzfile_total_in, 0);
3451
-
3452
- rb_define_singleton_method(cGzipWriter, "open", rb_gzwriter_s_open,-1);
3453
- rb_define_alloc_func(cGzipWriter, rb_gzwriter_s_allocate);
3454
- rb_define_method(cGzipWriter, "initialize", rb_gzwriter_initialize,-1);
3455
- rb_define_method(cGzipWriter, "flush", rb_gzwriter_flush, -1);
3456
- rb_define_method(cGzipWriter, "write", rb_gzwriter_write, 1);
3457
- rb_define_method(cGzipWriter, "putc", rb_gzwriter_putc, 1);
3458
- rb_define_method(cGzipWriter, "<<", rb_gzwriter_addstr, 1);
3459
- rb_define_method(cGzipWriter, "printf", rb_gzwriter_printf, -1);
3460
- rb_define_method(cGzipWriter, "print", rb_gzwriter_print, -1);
3461
- rb_define_method(cGzipWriter, "puts", rb_gzwriter_puts, -1);
3462
-
3463
- rb_define_singleton_method(cGzipReader, "open", rb_gzreader_s_open,-1);
3464
- rb_define_alloc_func(cGzipReader, rb_gzreader_s_allocate);
3465
- rb_define_method(cGzipReader, "initialize", rb_gzreader_initialize, 1);
3466
- rb_define_method(cGzipReader, "rewind", rb_gzreader_rewind, 0);
3467
- rb_define_method(cGzipReader, "unused", rb_gzreader_unused, 0);
3468
- rb_define_method(cGzipReader, "read", rb_gzreader_read, -1);
3469
- rb_define_method(cGzipReader, "getc", rb_gzreader_getc, 0);
3470
- rb_define_method(cGzipReader, "readchar", rb_gzreader_readchar, 0);
3471
- rb_define_method(cGzipReader, "each_byte", rb_gzreader_each_byte, 0);
3472
- rb_define_method(cGzipReader, "ungetc", rb_gzreader_ungetc, 1);
3473
- rb_define_method(cGzipReader, "gets", rb_gzreader_gets, -1);
3474
- rb_define_method(cGzipReader, "readline", rb_gzreader_readline, -1);
3475
- rb_define_method(cGzipReader, "each", rb_gzreader_each, -1);
3476
- rb_define_method(cGzipReader, "each_line", rb_gzreader_each, -1);
3477
- rb_define_method(cGzipReader, "readlines", rb_gzreader_readlines, -1);
3478
-
3479
- rb_define_const(mZlib, "OS_CODE", INT2FIX(OS_CODE));
3480
- rb_define_const(mZlib, "OS_MSDOS", INT2FIX(OS_MSDOS));
3481
- rb_define_const(mZlib, "OS_AMIGA", INT2FIX(OS_AMIGA));
3482
- rb_define_const(mZlib, "OS_VMS", INT2FIX(OS_VMS));
3483
- rb_define_const(mZlib, "OS_UNIX", INT2FIX(OS_UNIX));
3484
- rb_define_const(mZlib, "OS_ATARI", INT2FIX(OS_ATARI));
3485
- rb_define_const(mZlib, "OS_OS2", INT2FIX(OS_OS2));
3486
- rb_define_const(mZlib, "OS_MACOS", INT2FIX(OS_MACOS));
3487
- rb_define_const(mZlib, "OS_TOPS20", INT2FIX(OS_TOPS20));
3488
- rb_define_const(mZlib, "OS_WIN32", INT2FIX(OS_WIN32));
3489
-
3490
- rb_define_const(mZlib, "OS_VMCMS", INT2FIX(OS_VMCMS));
3491
- rb_define_const(mZlib, "OS_ZSYSTEM", INT2FIX(OS_ZSYSTEM));
3492
- rb_define_const(mZlib, "OS_CPM", INT2FIX(OS_CPM));
3493
- rb_define_const(mZlib, "OS_QDOS", INT2FIX(OS_QDOS));
3494
- rb_define_const(mZlib, "OS_RISCOS", INT2FIX(OS_RISCOS));
3495
- rb_define_const(mZlib, "OS_UNKNOWN", INT2FIX(OS_UNKNOWN));
3496
-
3497
- #endif /* GZIP_SUPPORT */
3498
- }
3499
-
3500
- /* Document error classes. */
3501
-
3502
- /*
3503
- * Document-class: Zlib::Error
3504
- *
3505
- * The superclass for all exceptions raised by Ruby/zlib.
3506
- *
3507
- * The following exceptions are defined as subclasses of Zlib::Error. These
3508
- * exceptions are raised when zlib library functions return with an error
3509
- * status.
3510
- *
3511
- * - Zlib::StreamEnd
3512
- * - Zlib::NeedDict
3513
- * - Zlib::DataError
3514
- * - Zlib::StreamError
3515
- * - Zlib::MemError
3516
- * - Zlib::BufError
3517
- * - Zlib::VersionError
3518
- *
3519
- */
3520
-
3521
- /*
3522
- * Document-class: Zlib::GzipFile::Error
3523
- *
3524
- * Base class of errors that occur when processing GZIP files.
3525
- */
3526
-
3527
- /*
3528
- * Document-class: Zlib::GzipFile::NoFooter
3529
- *
3530
- * Raised when gzip file footer is not found.
3531
- */
3532
-
3533
- /*
3534
- * Document-class: Zlib::GzipFile::CRCError
3535
- *
3536
- * Raised when the CRC checksum recorded in gzip file footer is not equivalent
3537
- * to the CRC checksum of the actual uncompressed data.
3538
- */
3539
-
3540
- /*
3541
- * Document-class: Zlib::GzipFile::LengthError
3542
- *
3543
- * Raised when the data length recorded in the gzip file footer is not equivalent
3544
- * to the length of the actual uncompressed data.
3545
- */
3546
-
3547
-