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,76 +0,0 @@
1
- /************************************************
2
-
3
- sockport.h -
4
-
5
- $Author: shyouhei $
6
- $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
7
- created at: Fri Apr 30 23:19:34 JST 1999
8
-
9
- ************************************************/
10
-
11
- #ifndef SOCKPORT_H
12
- #define SOCKPORT_H
13
-
14
- #ifndef SA_LEN
15
- # ifdef HAVE_SA_LEN
16
- # define SA_LEN(sa) (sa)->sa_len
17
- # else
18
- # ifdef INET6
19
- # define SA_LEN(sa) \
20
- (((sa)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) \
21
- : sizeof(struct sockaddr))
22
- # else
23
- /* by tradition, sizeof(struct sockaddr) covers most of the sockaddrs */
24
- # define SA_LEN(sa) (sizeof(struct sockaddr))
25
- # endif
26
- # endif
27
- #endif
28
-
29
- #ifdef HAVE_SA_LEN
30
- # define SET_SA_LEN(sa, len) (sa)->sa_len = (len)
31
- #else
32
- # define SET_SA_LEN(sa, len) (len)
33
- #endif
34
-
35
- #ifdef HAVE_SIN_LEN
36
- # define SIN_LEN(si) (si)->sin_len
37
- # define SET_SIN_LEN(si,len) (si)->sin_len = (len)
38
- #else
39
- # define SIN_LEN(si) sizeof(struct sockaddr_in)
40
- # define SET_SIN_LEN(si,len)
41
- #endif
42
-
43
- #ifndef IN_MULTICAST
44
- # define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000)
45
- # define IN_MULTICAST(i) IN_CLASSD(i)
46
- #endif
47
-
48
- #ifndef IN_EXPERIMENTAL
49
- # define IN_EXPERIMENTAL(i) ((((long)(i)) & 0xe0000000) == 0xe0000000)
50
- #endif
51
-
52
- #ifndef IN_CLASSA_NSHIFT
53
- # define IN_CLASSA_NSHIFT 24
54
- #endif
55
-
56
- #ifndef IN_LOOPBACKNET
57
- # define IN_LOOPBACKNET 127
58
- #endif
59
-
60
- #ifndef AF_UNSPEC
61
- # define AF_UNSPEC 0
62
- #endif
63
-
64
- #ifndef PF_UNSPEC
65
- # define PF_UNSPEC AF_UNSPEC
66
- #endif
67
-
68
- #ifndef PF_INET
69
- # define PF_INET AF_INET
70
- #endif
71
-
72
- #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
73
- extern int h_errno;
74
- #endif
75
-
76
- #endif
@@ -1,1306 +0,0 @@
1
- /**********************************************************************
2
-
3
- stringio.c -
4
-
5
- $Author: shyouhei $
6
- $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
7
- $RoughId: stringio.c,v 1.13 2002/03/14 03:24:18 nobu Exp $
8
- created at: Tue Feb 19 04:10:38 JST 2002
9
-
10
- All the files in this distribution are covered under the Ruby's
11
- license (see the file COPYING).
12
-
13
- **********************************************************************/
14
-
15
- #include <ruby/ruby.h>
16
- #include <ruby/rubyio.h>
17
-
18
- #include <fcntl.h>
19
-
20
-
21
- #define STRIO_EOF FMODE_SYNC
22
-
23
- struct StringIO {
24
- VALUE string;
25
- long pos;
26
- long lineno;
27
- int flags;
28
- int count;
29
- };
30
-
31
- static struct StringIO* strio_alloc _((void));
32
- static void strio_mark _((struct StringIO *));
33
- static void strio_free _((struct StringIO *));
34
- static struct StringIO* check_strio _((VALUE));
35
- static struct StringIO* get_strio _((VALUE));
36
- static struct StringIO* readable _((struct StringIO *));
37
- static struct StringIO* writable _((struct StringIO *));
38
- static void check_modifiable _((struct StringIO *));
39
-
40
- #define IS_STRIO(obj) (RDATA(obj)->dmark == (RUBY_DATA_FUNC)strio_mark)
41
- #define error_inval(msg) (errno = EINVAL, rb_sys_fail(msg))
42
-
43
- static struct StringIO *
44
- strio_alloc()
45
- {
46
- struct StringIO *ptr = ALLOC(struct StringIO);
47
- ptr->string = Qnil;
48
- ptr->pos = 0;
49
- ptr->lineno = 0;
50
- ptr->flags = 0;
51
- ptr->count = 1;
52
- return ptr;
53
- }
54
-
55
- static void
56
- strio_mark(ptr)
57
- struct StringIO *ptr;
58
- {
59
- if (ptr) {
60
- rb_gc_mark(ptr->string);
61
- }
62
- }
63
-
64
- static void
65
- strio_free(ptr)
66
- struct StringIO *ptr;
67
- {
68
- if (--ptr->count <= 0) {
69
- xfree(ptr);
70
- }
71
- }
72
-
73
- static struct StringIO*
74
- check_strio(self)
75
- VALUE self;
76
- {
77
- Check_Type(self, T_DATA);
78
- if (!IS_STRIO(self)) {
79
- rb_raise(rb_eTypeError, "wrong argument type %s (expected StringIO)",
80
- rb_class2name(CLASS_OF(self)));
81
- }
82
- return DATA_PTR(self);
83
- }
84
-
85
- static struct StringIO*
86
- get_strio(self)
87
- VALUE self;
88
- {
89
- struct StringIO *ptr = check_strio(self);
90
-
91
- if (!ptr) {
92
- rb_raise(rb_eIOError, "uninitialized stream");
93
- }
94
- return ptr;
95
- }
96
-
97
- #define StringIO(obj) get_strio(obj)
98
-
99
- #define CLOSED(ptr) (!((ptr)->flags & FMODE_READWRITE))
100
- #define READABLE(ptr) ((ptr)->flags & FMODE_READABLE)
101
- #define WRITABLE(ptr) ((ptr)->flags & FMODE_WRITABLE)
102
-
103
- static struct StringIO*
104
- readable(ptr)
105
- struct StringIO *ptr;
106
- {
107
- if (!READABLE(ptr)) {
108
- rb_raise(rb_eIOError, "not opened for reading");
109
- }
110
- return ptr;
111
- }
112
-
113
- static struct StringIO*
114
- writable(ptr)
115
- struct StringIO *ptr;
116
- {
117
- if (!WRITABLE(ptr)) {
118
- rb_raise(rb_eIOError, "not opened for writing");
119
- }
120
- if (!OBJ_TAINTED(ptr->string)) {
121
- rb_secure(4);
122
- }
123
- return ptr;
124
- }
125
-
126
- static void
127
- check_modifiable(ptr)
128
- struct StringIO *ptr;
129
- {
130
- if (OBJ_FROZEN(ptr->string)) {
131
- rb_raise(rb_eIOError, "not modifiable string");
132
- }
133
- }
134
-
135
- static VALUE strio_s_allocate _((VALUE));
136
- static VALUE strio_s_open _((int, VALUE *, VALUE));
137
- static VALUE strio_initialize _((int, VALUE *, VALUE));
138
- static VALUE strio_finalize _((VALUE));
139
- static VALUE strio_self _((VALUE));
140
- static VALUE strio_false _((VALUE));
141
- static VALUE strio_nil _((VALUE));
142
- static VALUE strio_0 _((VALUE));
143
- static VALUE strio_first _((VALUE, VALUE));
144
- static VALUE strio_unimpl _((int, VALUE *, VALUE));
145
- static VALUE strio_get_string _((VALUE));
146
- static VALUE strio_set_string _((VALUE, VALUE));
147
- static VALUE strio_close _((VALUE));
148
- static VALUE strio_close_read _((VALUE));
149
- static VALUE strio_close_write _((VALUE));
150
- static VALUE strio_closed _((VALUE));
151
- static VALUE strio_closed_read _((VALUE));
152
- static VALUE strio_closed_write _((VALUE));
153
- static VALUE strio_eof _((VALUE));
154
- static VALUE strio_get_lineno _((VALUE));
155
- static VALUE strio_set_lineno _((VALUE, VALUE));
156
- static VALUE strio_get_pos _((VALUE));
157
- static VALUE strio_set_pos _((VALUE, VALUE));
158
- static VALUE strio_rewind _((VALUE));
159
- static VALUE strio_seek _((int, VALUE *, VALUE));
160
- static VALUE strio_get_sync _((VALUE));
161
- static VALUE strio_each_byte _((VALUE));
162
- static VALUE strio_getc _((VALUE));
163
- static VALUE strio_ungetc _((VALUE, VALUE));
164
- static VALUE strio_readchar _((VALUE));
165
- static VALUE strio_getline _((int, VALUE *, struct StringIO *));
166
- static VALUE strio_gets _((int, VALUE *, VALUE));
167
- static VALUE strio_readline _((int, VALUE *, VALUE));
168
- static VALUE strio_each _((int, VALUE *, VALUE));
169
- static VALUE strio_readlines _((int, VALUE *, VALUE));
170
- static VALUE strio_write _((VALUE, VALUE));
171
- static VALUE strio_putc _((VALUE, VALUE));
172
- static VALUE strio_read _((int, VALUE *, VALUE));
173
- static VALUE strio_size _((VALUE));
174
- static VALUE strio_truncate _((VALUE, VALUE));
175
- void Init_stringio _((void));
176
-
177
- /* Boyer-Moore search: copied from regex.c */
178
- static void bm_init_skip _((long *, const char *, long));
179
- static long bm_search _((const char *, long, const char *, long, const long *));
180
-
181
- static VALUE
182
- strio_s_allocate(klass)
183
- VALUE klass;
184
- {
185
- return Data_Wrap_Struct(klass, strio_mark, strio_free, 0);
186
- }
187
-
188
- /*
189
- * call-seq: StringIO.open(string=""[, mode]) {|strio| ...}
190
- *
191
- * Equivalent to StringIO.new except that when it is called with a block, it
192
- * yields with the new instance and closes it, and returns the result which
193
- * returned from the block.
194
- */
195
- static VALUE
196
- strio_s_open(argc, argv, klass)
197
- int argc;
198
- VALUE *argv;
199
- VALUE klass;
200
- {
201
- VALUE obj = rb_class_new_instance(argc, argv, klass);
202
- if (!rb_block_given_p()) return obj;
203
- return rb_ensure(rb_yield, obj, strio_finalize, obj);
204
- }
205
-
206
- /*
207
- * call-seq: StringIO.new(string=""[, mode])
208
- *
209
- * Creates new StringIO instance from with _string_ and _mode_.
210
- */
211
- static VALUE
212
- strio_initialize(argc, argv, self)
213
- int argc;
214
- VALUE *argv;
215
- VALUE self;
216
- {
217
- struct StringIO *ptr = check_strio(self);
218
- VALUE string, mode;
219
- int trunc = Qfalse;
220
-
221
- if (!ptr) {
222
- DATA_PTR(self) = ptr = strio_alloc();
223
- }
224
- rb_call_super(0, 0);
225
- switch (rb_scan_args(argc, argv, "02", &string, &mode)) {
226
- case 2:
227
- if (FIXNUM_P(mode)) {
228
- int flags = FIX2INT(mode);
229
- ptr->flags = rb_io_modenum_flags(flags);
230
- trunc = flags & O_TRUNC;
231
- }
232
- else {
233
- const char *m = StringValueCStr(mode);
234
- ptr->flags = rb_io_mode_flags(m);
235
- trunc = *m == 'w';
236
- }
237
- StringValue(string);
238
- if ((ptr->flags & FMODE_WRITABLE) && OBJ_FROZEN(string)) {
239
- errno = EACCES;
240
- rb_sys_fail(0);
241
- }
242
- if (trunc) {
243
- rb_str_resize(string, 0);
244
- }
245
- break;
246
- case 1:
247
- StringValue(string);
248
- ptr->flags = OBJ_FROZEN(string) ? FMODE_READABLE : FMODE_READWRITE;
249
- break;
250
- case 0:
251
- string = rb_str_new("", 0);
252
- ptr->flags = FMODE_READWRITE;
253
- break;
254
- }
255
- ptr->string = string;
256
- return self;
257
- }
258
-
259
- static VALUE
260
- strio_finalize(self)
261
- VALUE self;
262
- {
263
- struct StringIO *ptr = StringIO(self);
264
- ptr->string = Qnil;
265
- ptr->flags &= ~FMODE_READWRITE;
266
- return self;
267
- }
268
-
269
- /*
270
- * Returns +false+. Just for compatibility to IO.
271
- */
272
- static VALUE
273
- strio_false(self)
274
- VALUE self;
275
- {
276
- StringIO(self);
277
- return Qfalse;
278
- }
279
-
280
- /*
281
- * Returns +nil+. Just for compatibility to IO.
282
- */
283
- static VALUE
284
- strio_nil(self)
285
- VALUE self;
286
- {
287
- StringIO(self);
288
- return Qnil;
289
- }
290
-
291
- /*
292
- * Returns *strio* itself. Just for compatibility to IO.
293
- */
294
- static VALUE
295
- strio_self(self)
296
- VALUE self;
297
- {
298
- StringIO(self);
299
- return self;
300
- }
301
-
302
- /*
303
- * Returns 0. Just for compatibility to IO.
304
- */
305
- static VALUE
306
- strio_0(self)
307
- VALUE self;
308
- {
309
- StringIO(self);
310
- return INT2FIX(0);
311
- }
312
-
313
- /*
314
- * Returns the argument unchanged. Just for compatibility to IO.
315
- */
316
- static VALUE
317
- strio_first(self, arg)
318
- VALUE self, arg;
319
- {
320
- StringIO(self);
321
- return arg;
322
- }
323
-
324
- /*
325
- * Raises NotImplementedError.
326
- */
327
- static VALUE
328
- strio_unimpl(argc, argv, self)
329
- int argc;
330
- VALUE *argv;
331
- VALUE self;
332
- {
333
- StringIO(self);
334
- rb_notimplement();
335
- return Qnil; /* not reached */
336
- }
337
-
338
- /*
339
- * call-seq: strio.string -> string
340
- *
341
- * Returns underlying String object, the subject of IO.
342
- */
343
- static VALUE
344
- strio_get_string(self)
345
- VALUE self;
346
- {
347
- return StringIO(self)->string;
348
- }
349
-
350
- /*
351
- * call-seq:
352
- * strio.string = string -> string
353
- *
354
- * Changes underlying String object, the subject of IO.
355
- */
356
- static VALUE
357
- strio_set_string(self, string)
358
- VALUE self, string;
359
- {
360
- struct StringIO *ptr = StringIO(self);
361
-
362
- if (!OBJ_TAINTED(self)) rb_secure(4);
363
- ptr->flags &= ~FMODE_READWRITE;
364
- StringValue(string);
365
- ptr->flags = OBJ_FROZEN(string) ? FMODE_READABLE : FMODE_READWRITE;
366
- ptr->pos = 0;
367
- ptr->lineno = 0;
368
- return ptr->string = string;
369
- }
370
-
371
- /*
372
- * call-seq:
373
- * strio.close -> nil
374
- *
375
- * Closes strio. The *strio* is unavailable for any further data
376
- * operations; an +IOError+ is raised if such an attempt is made.
377
- */
378
- static VALUE
379
- strio_close(self)
380
- VALUE self;
381
- {
382
- struct StringIO *ptr = StringIO(self);
383
- if (CLOSED(ptr)) {
384
- rb_raise(rb_eIOError, "closed stream");
385
- }
386
- ptr->flags &= ~FMODE_READWRITE;
387
- return Qnil;
388
- }
389
-
390
- /*
391
- * call-seq:
392
- * strio.close_read -> nil
393
- *
394
- * Closes the read end of a StringIO. Will raise an +IOError+ if the
395
- * *strio* is not readable.
396
- */
397
- static VALUE
398
- strio_close_read(self)
399
- VALUE self;
400
- {
401
- struct StringIO *ptr = StringIO(self);
402
- if (!READABLE(ptr)) {
403
- rb_raise(rb_eIOError, "closing non-duplex IO for reading");
404
- }
405
- ptr->flags &= ~FMODE_READABLE;
406
- return Qnil;
407
- }
408
-
409
- /*
410
- * call-seq:
411
- * strio.close_write -> nil
412
- *
413
- * Closes the write end of a StringIO. Will raise an +IOError+ if the
414
- * *strio* is not writeable.
415
- */
416
- static VALUE
417
- strio_close_write(self)
418
- VALUE self;
419
- {
420
- struct StringIO *ptr = StringIO(self);
421
- if (!WRITABLE(ptr)) {
422
- rb_raise(rb_eIOError, "closing non-duplex IO for writing");
423
- }
424
- ptr->flags &= ~FMODE_WRITABLE;
425
- return Qnil;
426
- }
427
-
428
- /*
429
- * call-seq:
430
- * strio.closed? -> true or false
431
- *
432
- * Returns +true+ if *strio* is completely closed, +false+ otherwise.
433
- */
434
- static VALUE
435
- strio_closed(self)
436
- VALUE self;
437
- {
438
- struct StringIO *ptr = StringIO(self);
439
- if (!CLOSED(ptr)) return Qfalse;
440
- return Qtrue;
441
- }
442
-
443
- /*
444
- * call-seq:
445
- * strio.closed_read? -> true or false
446
- *
447
- * Returns +true+ if *strio* is not readable, +false+ otherwise.
448
- */
449
- static VALUE
450
- strio_closed_read(self)
451
- VALUE self;
452
- {
453
- struct StringIO *ptr = StringIO(self);
454
- if (READABLE(ptr)) return Qfalse;
455
- return Qtrue;
456
- }
457
-
458
- /*
459
- * call-seq:
460
- * strio.closed_write? -> true or false
461
- *
462
- * Returns +true+ if *strio* is not writable, +false+ otherwise.
463
- */
464
- static VALUE
465
- strio_closed_write(self)
466
- VALUE self;
467
- {
468
- struct StringIO *ptr = StringIO(self);
469
- if (WRITABLE(ptr)) return Qfalse;
470
- return Qtrue;
471
- }
472
-
473
- /*
474
- * call-seq:
475
- * strio.eof -> true or false
476
- * strio.eof? -> true or false
477
- *
478
- * Returns true if *strio* is at end of file. The stringio must be
479
- * opened for reading or an +IOError+ will be raised.
480
- */
481
- static VALUE
482
- strio_eof(self)
483
- VALUE self;
484
- {
485
- struct StringIO *ptr = readable(StringIO(self));
486
- if (ptr->pos < RSTRING(ptr->string)->len) return Qfalse;
487
- return Qtrue;
488
- }
489
-
490
- /* :nodoc: */
491
- static VALUE
492
- strio_copy(copy, orig)
493
- VALUE copy, orig;
494
- {
495
- struct StringIO *ptr;
496
-
497
- orig = rb_convert_type(orig, T_DATA, "StringIO", "to_strio");
498
- if (copy == orig) return copy;
499
- ptr = StringIO(orig);
500
- if (check_strio(copy)) {
501
- strio_free(DATA_PTR(copy));
502
- }
503
- DATA_PTR(copy) = ptr;
504
- OBJ_INFECT(copy, orig);
505
- ++ptr->count;
506
- return copy;
507
- }
508
-
509
- /*
510
- * call-seq:
511
- * strio.lineno -> integer
512
- *
513
- * Returns the current line number in *strio*. The stringio must be
514
- * opened for reading. +lineno+ counts the number of times +gets+ is
515
- * called, rather than the number of newlines encountered. The two
516
- * values will differ if +gets+ is called with a separator other than
517
- * newline. See also the <code>$.</code> variable.
518
- */
519
- static VALUE
520
- strio_get_lineno(self)
521
- VALUE self;
522
- {
523
- return LONG2NUM(StringIO(self)->lineno);
524
- }
525
-
526
- /*
527
- * call-seq:
528
- * strio.lineno = integer -> integer
529
- *
530
- * Manually sets the current line number to the given value.
531
- * <code>$.</code> is updated only on the next read.
532
- */
533
- static VALUE
534
- strio_set_lineno(self, lineno)
535
- VALUE self, lineno;
536
- {
537
- StringIO(self)->lineno = NUM2LONG(lineno);
538
- return lineno;
539
- }
540
-
541
- /* call-seq: strio.binmode -> true */
542
- #define strio_binmode strio_self
543
-
544
- /* call-seq: strio.fcntl */
545
- #define strio_fcntl strio_unimpl
546
-
547
- /* call-seq: strio.flush -> strio */
548
- #define strio_flush strio_self
549
-
550
- /* call-seq: strio.fsync -> 0 */
551
- #define strio_fsync strio_0
552
-
553
- /*
554
- * call-seq:
555
- * strio.reopen(other_StrIO) -> strio
556
- * strio.reopen(string, mode) -> strio
557
- *
558
- * Reinitializes *strio* with the given <i>other_StrIO</i> or _string_
559
- * and _mode_ (see StringIO#new).
560
- */
561
- static VALUE
562
- strio_reopen(argc, argv, self)
563
- int argc;
564
- VALUE *argv;
565
- VALUE self;
566
- {
567
- if (!OBJ_TAINTED(self)) rb_secure(4);
568
- if (argc == 1 && TYPE(*argv) != T_STRING) {
569
- return strio_copy(self, *argv);
570
- }
571
- return strio_initialize(argc, argv, self);
572
- }
573
-
574
- /*
575
- * call-seq:
576
- * strio.pos -> integer
577
- * strio.tell -> integer
578
- *
579
- * Returns the current offset (in bytes) of *strio*.
580
- */
581
- static VALUE
582
- strio_get_pos(self)
583
- VALUE self;
584
- {
585
- return LONG2NUM(StringIO(self)->pos);
586
- }
587
-
588
- /*
589
- * call-seq:
590
- * strio.pos = integer -> integer
591
- *
592
- * Seeks to the given position (in bytes) in *strio*.
593
- */
594
- static VALUE
595
- strio_set_pos(self, pos)
596
- VALUE self;
597
- VALUE pos;
598
- {
599
- struct StringIO *ptr = StringIO(self);
600
- long p = NUM2LONG(pos);
601
- if (p < 0) {
602
- error_inval(0);
603
- }
604
- ptr->pos = p;
605
- ptr->flags &= ~STRIO_EOF;
606
- return pos;
607
- }
608
-
609
- /*
610
- * call-seq:
611
- * strio.rewind -> 0
612
- *
613
- * Positions *strio* to the beginning of input, resetting
614
- * +lineno+ to zero.
615
- */
616
- static VALUE
617
- strio_rewind(self)
618
- VALUE self;
619
- {
620
- struct StringIO *ptr = StringIO(self);
621
- ptr->pos = 0;
622
- ptr->lineno = 0;
623
- ptr->flags &= ~STRIO_EOF;
624
- return INT2FIX(0);
625
- }
626
-
627
- /*
628
- * call-seq:
629
- * strio.seek(amount, whence=SEEK_SET) -> 0
630
- *
631
- * Seeks to a given offset _amount_ in the stream according to
632
- * the value of _whence_ (see IO#seek).
633
- */
634
- static VALUE
635
- strio_seek(argc, argv, self)
636
- int argc;
637
- VALUE *argv;
638
- VALUE self;
639
- {
640
- VALUE whence;
641
- struct StringIO *ptr = StringIO(self);
642
- long offset;
643
-
644
- rb_scan_args(argc, argv, "11", NULL, &whence);
645
- offset = NUM2LONG(argv[0]);
646
- switch (NIL_P(whence) ? 0 : NUM2LONG(whence)) {
647
- case 0:
648
- break;
649
- case 1:
650
- offset += ptr->pos;
651
- break;
652
- case 2:
653
- offset += RSTRING(ptr->string)->len;
654
- break;
655
- default:
656
- rb_raise(rb_eArgError, "invalid whence %ld", NUM2LONG(whence));
657
- }
658
- if (offset < 0) {
659
- error_inval(0);
660
- }
661
- ptr->pos = offset;
662
- ptr->flags &= ~STRIO_EOF;
663
- return INT2FIX(0);
664
- }
665
-
666
- /*
667
- * call-seq:
668
- * strio.sync -> true
669
- *
670
- * Returns +true+ always.
671
- */
672
- static VALUE
673
- strio_get_sync(self)
674
- VALUE self;
675
- {
676
- StringIO(self);
677
- return Qtrue;
678
- }
679
-
680
- /* call-seq: strio.sync = boolean -> boolean */
681
- #define strio_set_sync strio_first
682
-
683
- #define strio_tell strio_get_pos
684
-
685
- /*
686
- * call-seq:
687
- * strio.each_byte {|byte| block } -> strio
688
- *
689
- * See IO#each_byte.
690
- */
691
- static VALUE
692
- strio_each_byte(self)
693
- VALUE self;
694
- {
695
- struct StringIO *ptr = readable(StringIO(self));
696
- while (ptr->pos < RSTRING(ptr->string)->len) {
697
- char c = RSTRING(ptr->string)->ptr[ptr->pos++];
698
- rb_yield(CHR2FIX(c));
699
- }
700
- return Qnil;
701
- }
702
-
703
- /*
704
- * call-seq:
705
- * strio.getc -> fixnum or nil
706
- *
707
- * See IO#getc.
708
- */
709
- static VALUE
710
- strio_getc(self)
711
- VALUE self;
712
- {
713
- struct StringIO *ptr = readable(StringIO(self));
714
- int c;
715
- if (ptr->pos >= RSTRING(ptr->string)->len) {
716
- ptr->flags |= STRIO_EOF;
717
- return Qnil;
718
- }
719
- c = RSTRING(ptr->string)->ptr[ptr->pos++];
720
- return CHR2FIX(c);
721
- }
722
-
723
- static void
724
- strio_extend(ptr, pos, len)
725
- struct StringIO *ptr;
726
- long pos, len;
727
- {
728
- long olen;
729
-
730
- check_modifiable(ptr);
731
- olen = RSTRING(ptr->string)->len;
732
- if (pos + len > olen) {
733
- rb_str_resize(ptr->string, pos + len);
734
- if (pos > olen)
735
- MEMZERO(RSTRING(ptr->string)->ptr + olen, char, pos - olen);
736
- }
737
- else {
738
- rb_str_modify(ptr->string);
739
- }
740
- }
741
-
742
- /*
743
- * call-seq:
744
- * strio.ungetc(integer) -> nil
745
- *
746
- * Pushes back one character (passed as a parameter) onto *strio*
747
- * such that a subsequent buffered read will return it. Pushing back
748
- * behind the beginning of the buffer string is not possible. Nothing
749
- * will be done if such an attempt is made.
750
- * In other case, there is no limitation for multiple pushbacks.
751
- */
752
- static VALUE
753
- strio_ungetc(self, ch)
754
- VALUE self, ch;
755
- {
756
- struct StringIO *ptr = readable(StringIO(self));
757
- int cc = NUM2INT(ch);
758
- long len, pos = ptr->pos;
759
-
760
- if (cc != EOF && pos > 0) {
761
- if ((len = RSTRING(ptr->string)->len) < pos-- ||
762
- (unsigned char)RSTRING(ptr->string)->ptr[pos] !=
763
- (unsigned char)cc) {
764
- strio_extend(ptr, pos, 1);
765
- RSTRING(ptr->string)->ptr[pos] = cc;
766
- OBJ_INFECT(ptr->string, self);
767
- }
768
- --ptr->pos;
769
- ptr->flags &= ~STRIO_EOF;
770
- }
771
- return Qnil;
772
- }
773
-
774
- /*
775
- * call-seq:
776
- * strio.readchar -> fixnum
777
- *
778
- * See IO#readchar.
779
- */
780
- static VALUE
781
- strio_readchar(self)
782
- VALUE self;
783
- {
784
- VALUE c = strio_getc(self);
785
- if (NIL_P(c)) rb_eof_error();
786
- return c;
787
- }
788
-
789
- static void
790
- bm_init_skip(skip, pat, m)
791
- long *skip;
792
- const char *pat;
793
- long m;
794
- {
795
- int c;
796
-
797
- for (c = 0; c < (1 << CHAR_BIT); c++) {
798
- skip[c] = m;
799
- }
800
- while (--m) {
801
- skip[(unsigned char)*pat++] = m;
802
- }
803
- }
804
-
805
- static long
806
- bm_search(little, llen, big, blen, skip)
807
- const char *little;
808
- long llen;
809
- const char *big;
810
- long blen;
811
- const long *skip;
812
- {
813
- long i, j, k;
814
-
815
- i = llen - 1;
816
- while (i < blen) {
817
- k = i;
818
- j = llen - 1;
819
- while (j >= 0 && big[k] == little[j]) {
820
- k--;
821
- j--;
822
- }
823
- if (j < 0) return k + 1;
824
- i += skip[(unsigned char)big[i]];
825
- }
826
- return -1;
827
- }
828
-
829
- static VALUE
830
- strio_getline(argc, argv, ptr)
831
- int argc;
832
- VALUE *argv;
833
- struct StringIO *ptr;
834
- {
835
- const char *s, *e, *p;
836
- long n;
837
- VALUE str;
838
-
839
- if (argc == 0) {
840
- str = rb_rs;
841
- }
842
- else {
843
- rb_scan_args(argc, argv, "1", &str);
844
- if (!NIL_P(str)) StringValue(str);
845
- }
846
-
847
- if (ptr->pos >= (n = RSTRING(ptr->string)->len)) {
848
- ptr->flags |= STRIO_EOF;
849
- return Qnil;
850
- }
851
- s = RSTRING(ptr->string)->ptr;
852
- e = s + RSTRING(ptr->string)->len;
853
- s += ptr->pos;
854
- if (NIL_P(str)) {
855
- str = rb_str_substr(ptr->string, ptr->pos, e - s);
856
- }
857
- else if ((n = RSTRING(str)->len) == 0) {
858
- p = s;
859
- while (*p == '\n') {
860
- if (++p == e) {
861
- ptr->flags |= STRIO_EOF;
862
- return Qnil;
863
- }
864
- }
865
- s = p;
866
- while ((p = memchr(p, '\n', e - p)) && (p != e)) {
867
- if (*++p == '\n') {
868
- e = p;
869
- break;
870
- }
871
- }
872
- str = rb_str_substr(ptr->string, s - RSTRING(ptr->string)->ptr, e - s);
873
- }
874
- else if (n == 1) {
875
- if ((p = memchr(s, RSTRING(str)->ptr[0], e - s)) != 0) {
876
- e = p + 1;
877
- }
878
- str = rb_str_substr(ptr->string, ptr->pos, e - s);
879
- }
880
- else {
881
- if (n < e - s) {
882
- if (e - s < 1024) {
883
- for (p = s; p + n <= e; ++p) {
884
- if (MEMCMP(p, RSTRING(str)->ptr, char, n) == 0) {
885
- e = p + n;
886
- break;
887
- }
888
- }
889
- }
890
- else {
891
- long skip[1 << CHAR_BIT], pos;
892
- p = RSTRING(str)->ptr;
893
- bm_init_skip(skip, p, n);
894
- if ((pos = bm_search(p, n, s, e - s, skip)) >= 0) {
895
- e = s + pos + n;
896
- }
897
- }
898
- }
899
- str = rb_str_substr(ptr->string, ptr->pos, e - s);
900
- }
901
- ptr->pos = e - RSTRING(ptr->string)->ptr;
902
- ptr->lineno++;
903
- return str;
904
- }
905
-
906
- /*
907
- * call-seq:
908
- * strio.gets(sep_string=$/) -> string or nil
909
- *
910
- * See IO#gets.
911
- */
912
- static VALUE
913
- strio_gets(argc, argv, self)
914
- int argc;
915
- VALUE *argv;
916
- VALUE self;
917
- {
918
- VALUE str = strio_getline(argc, argv, readable(StringIO(self)));
919
-
920
- rb_lastline_set(str);
921
- return str;
922
- }
923
-
924
- /*
925
- * call-seq:
926
- * strio.readline(sep_string=$/) -> string
927
- *
928
- * See IO#readline.
929
- */
930
- static VALUE
931
- strio_readline(argc, argv, self)
932
- int argc;
933
- VALUE *argv;
934
- VALUE self;
935
- {
936
- VALUE line = strio_getline(argc, argv, readable(StringIO(self)));
937
- if (NIL_P(line)) rb_eof_error();
938
- return line;
939
- }
940
-
941
- /*
942
- * call-seq:
943
- * strio.each(sep_string=$/) {|line| block } -> strio
944
- * strio.each_line(sep_string=$/) {|line| block } -> strio
945
- *
946
- * See IO#each.
947
- */
948
- static VALUE
949
- strio_each(argc, argv, self)
950
- int argc;
951
- VALUE *argv;
952
- VALUE self;
953
- {
954
- struct StringIO *ptr = StringIO(self);
955
- VALUE line;
956
-
957
- while (!NIL_P(line = strio_getline(argc, argv, readable(ptr)))) {
958
- rb_yield(line);
959
- }
960
- return self;
961
- }
962
-
963
- /*
964
- * call-seq:
965
- * strio.readlines(sep_string=$/) -> array
966
- *
967
- * See IO#readlines.
968
- */
969
- static VALUE
970
- strio_readlines(argc, argv, self)
971
- int argc;
972
- VALUE *argv;
973
- VALUE self;
974
- {
975
- struct StringIO *ptr = StringIO(self);
976
- VALUE ary = rb_ary_new(), line;
977
- while (!NIL_P(line = strio_getline(argc, argv, readable(ptr)))) {
978
- rb_ary_push(ary, line);
979
- }
980
- return ary;
981
- }
982
-
983
- /*
984
- * call-seq:
985
- * strio.write(string) -> integer
986
- * strio.syswrite(string) -> integer
987
- *
988
- * Appends the given string to the underlying buffer string of *strio*.
989
- * The stream must be opened for writing. If the argument is not a
990
- * string, it will be converted to a string using <code>to_s</code>.
991
- * Returns the number of bytes written. See IO#write.
992
- */
993
- static VALUE
994
- strio_write(self, str)
995
- VALUE self, str;
996
- {
997
- struct StringIO *ptr = writable(StringIO(self));
998
- long len, olen;
999
-
1000
- if (TYPE(str) != T_STRING)
1001
- str = rb_obj_as_string(str);
1002
- len = RSTRING(str)->len;
1003
- if (!len) return INT2FIX(0);
1004
- check_modifiable(ptr);
1005
- olen = RSTRING(ptr->string)->len;
1006
- if (ptr->flags & FMODE_APPEND) {
1007
- ptr->pos = olen;
1008
- }
1009
- if (ptr->pos == olen) {
1010
- rb_str_cat(ptr->string, RSTRING(str)->ptr, len);
1011
- }
1012
- else {
1013
- strio_extend(ptr, ptr->pos, len);
1014
- rb_str_update(ptr->string, ptr->pos, len, str);
1015
- }
1016
- OBJ_INFECT(ptr->string, self);
1017
- ptr->pos += len;
1018
- return LONG2NUM(len);
1019
- }
1020
-
1021
- /*
1022
- * call-seq:
1023
- * strio << obj -> strio
1024
- *
1025
- * See IO#<<.
1026
- */
1027
- #define strio_addstr rb_io_addstr
1028
-
1029
- /*
1030
- * call-seq:
1031
- * strio.print() -> nil
1032
- * strio.print(obj, ...) -> nil
1033
- *
1034
- * See IO#print.
1035
- */
1036
- #define strio_print rb_io_print
1037
-
1038
- /*
1039
- * call-seq:
1040
- * strio.printf(format_string [, obj, ...] ) -> nil
1041
- *
1042
- * See IO#printf.
1043
- */
1044
- #define strio_printf rb_io_printf
1045
-
1046
- /*
1047
- * call-seq:
1048
- * strio.putc(obj) -> obj
1049
- *
1050
- * See IO#putc.
1051
- */
1052
- static VALUE
1053
- strio_putc(self, ch)
1054
- VALUE self, ch;
1055
- {
1056
- struct StringIO *ptr = writable(StringIO(self));
1057
- int c = NUM2CHR(ch);
1058
- long olen;
1059
-
1060
- check_modifiable(ptr);
1061
- olen = RSTRING(ptr->string)->len;
1062
- if (ptr->flags & FMODE_APPEND) {
1063
- ptr->pos = olen;
1064
- }
1065
- strio_extend(ptr, ptr->pos, 1);
1066
- RSTRING(ptr->string)->ptr[ptr->pos++] = c;
1067
- OBJ_INFECT(ptr->string, self);
1068
- return ch;
1069
- }
1070
-
1071
- /*
1072
- * call-seq:
1073
- * strio.puts(obj, ...) -> nil
1074
- *
1075
- * See IO#puts.
1076
- */
1077
- #define strio_puts rb_io_puts
1078
-
1079
- /*
1080
- * call-seq:
1081
- * strio.read([length [, buffer]]) -> string, buffer, or nil
1082
- *
1083
- * See IO#read.
1084
- */
1085
- static VALUE
1086
- strio_read(argc, argv, self)
1087
- int argc;
1088
- VALUE *argv;
1089
- VALUE self;
1090
- {
1091
- struct StringIO *ptr = readable(StringIO(self));
1092
- VALUE str = Qnil;
1093
- long len, olen;
1094
-
1095
- switch (argc) {
1096
- case 2:
1097
- str = argv[1];
1098
- StringValue(str);
1099
- rb_str_modify(str);
1100
- case 1:
1101
- if (!NIL_P(argv[0])) {
1102
- len = olen = NUM2LONG(argv[0]);
1103
- if (len < 0) {
1104
- rb_raise(rb_eArgError, "negative length %ld given", len);
1105
- }
1106
- if (len > 0 && ptr->pos >= RSTRING(ptr->string)->len) {
1107
- ptr->flags |= STRIO_EOF;
1108
- if (!NIL_P(str)) rb_str_resize(str, 0);
1109
- return Qnil;
1110
- }
1111
- else if (ptr->flags & STRIO_EOF) {
1112
- if (!NIL_P(str)) rb_str_resize(str, 0);
1113
- return Qnil;
1114
- }
1115
- break;
1116
- }
1117
- /* fall through */
1118
- case 0:
1119
- olen = -1;
1120
- len = RSTRING(ptr->string)->len;
1121
- if (len <= ptr->pos) {
1122
- ptr->flags |= STRIO_EOF;
1123
- if (NIL_P(str)) {
1124
- str = rb_str_new(0, 0);
1125
- }
1126
- else {
1127
- rb_str_resize(str, 0);
1128
- }
1129
- return str;
1130
- }
1131
- else {
1132
- len -= ptr->pos;
1133
- }
1134
- break;
1135
- default:
1136
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
1137
- }
1138
- if (NIL_P(str)) {
1139
- str = rb_str_substr(ptr->string, ptr->pos, len);
1140
- }
1141
- else {
1142
- long rest = RSTRING(ptr->string)->len - ptr->pos;
1143
- if (len > rest) len = rest;
1144
- rb_str_resize(str, len);
1145
- MEMCPY(RSTRING(str)->ptr, RSTRING(ptr->string)->ptr + ptr->pos, char, len);
1146
- }
1147
- if (NIL_P(str)) {
1148
- if (!(ptr->flags & STRIO_EOF)) str = rb_str_new(0, 0);
1149
- len = 0;
1150
- }
1151
- else {
1152
- ptr->pos += len = RSTRING(str)->len;
1153
- }
1154
- if (olen < 0 || olen > len) ptr->flags |= STRIO_EOF;
1155
- return str;
1156
- }
1157
-
1158
- /*
1159
- * call-seq:
1160
- * strio.sysread(integer[, outbuf]) -> string
1161
- *
1162
- * Similar to #read, but raises +EOFError+ at end of string instead of
1163
- * returning +nil+, as well as IO#sysread does.
1164
- */
1165
- static VALUE
1166
- strio_sysread(argc, argv, self)
1167
- int argc;
1168
- VALUE *argv;
1169
- VALUE self;
1170
- {
1171
- VALUE val = strio_read(argc, argv, self);
1172
- if (NIL_P(val) || RSTRING(val)->len == 0) {
1173
- rb_eof_error();
1174
- }
1175
- return val;
1176
- }
1177
-
1178
- #define strio_syswrite strio_write
1179
-
1180
- /* call-seq: strio.path -> nil */
1181
- #define strio_path strio_nil
1182
-
1183
- /*
1184
- * call-seq:
1185
- * strio.isatty -> nil
1186
- * strio.tty? -> nil
1187
- *
1188
- */
1189
- #define strio_isatty strio_false
1190
-
1191
- /* call-seq: strio.pid -> nil */
1192
- #define strio_pid strio_nil
1193
-
1194
- /* call-seq: strio.fileno -> nil */
1195
- #define strio_fileno strio_nil
1196
-
1197
- /*
1198
- * call-seq:
1199
- * strio.size -> integer
1200
- *
1201
- * Returns the size of the buffer string.
1202
- */
1203
- static VALUE
1204
- strio_size(self)
1205
- VALUE self;
1206
- {
1207
- VALUE string = StringIO(self)->string;
1208
- if (NIL_P(string)) {
1209
- rb_raise(rb_eIOError, "not opened");
1210
- }
1211
- return ULONG2NUM(RSTRING(string)->len);
1212
- }
1213
-
1214
- /*
1215
- * call-seq:
1216
- * strio.truncate(integer) -> 0
1217
- *
1218
- * Truncates the buffer string to at most _integer_ bytes. The *strio*
1219
- * must be opened for writing.
1220
- */
1221
- static VALUE
1222
- strio_truncate(self, len)
1223
- VALUE self, len;
1224
- {
1225
- VALUE string = writable(StringIO(self))->string;
1226
- long l = NUM2LONG(len);
1227
- long plen = RSTRING(string)->len;
1228
- if (l < 0) {
1229
- error_inval("negative legnth");
1230
- }
1231
- rb_str_resize(string, l);
1232
- if (plen < l) {
1233
- MEMZERO(RSTRING(string)->ptr + plen, char, l - plen);
1234
- }
1235
- return len;
1236
- }
1237
-
1238
- /*
1239
- * Pseudo I/O on String object.
1240
- */
1241
- void
1242
- Init_stringio()
1243
- {
1244
- VALUE StringIO = rb_define_class("StringIO", rb_cData);
1245
-
1246
- rb_include_module(StringIO, rb_mEnumerable);
1247
- rb_define_alloc_func(StringIO, strio_s_allocate);
1248
- rb_define_singleton_method(StringIO, "open", strio_s_open, -1);
1249
- rb_define_method(StringIO, "initialize", strio_initialize, -1);
1250
- rb_define_method(StringIO, "initialize_copy", strio_copy, 1);
1251
- rb_define_method(StringIO, "reopen", strio_reopen, -1);
1252
-
1253
- rb_define_method(StringIO, "string", strio_get_string, 0);
1254
- rb_define_method(StringIO, "string=", strio_set_string, 1);
1255
- rb_define_method(StringIO, "lineno", strio_get_lineno, 0);
1256
- rb_define_method(StringIO, "lineno=", strio_set_lineno, 1);
1257
-
1258
- rb_define_method(StringIO, "binmode", strio_binmode, 0);
1259
- rb_define_method(StringIO, "close", strio_close, 0);
1260
- rb_define_method(StringIO, "close_read", strio_close_read, 0);
1261
- rb_define_method(StringIO, "close_write", strio_close_write, 0);
1262
- rb_define_method(StringIO, "closed?", strio_closed, 0);
1263
- rb_define_method(StringIO, "closed_read?", strio_closed_read, 0);
1264
- rb_define_method(StringIO, "closed_write?", strio_closed_write, 0);
1265
- rb_define_method(StringIO, "eof", strio_eof, 0);
1266
- rb_define_method(StringIO, "eof?", strio_eof, 0);
1267
- rb_define_method(StringIO, "fcntl", strio_fcntl, -1);
1268
- rb_define_method(StringIO, "flush", strio_flush, 0);
1269
- rb_define_method(StringIO, "fsync", strio_fsync, 0);
1270
- rb_define_method(StringIO, "pos", strio_get_pos, 0);
1271
- rb_define_method(StringIO, "pos=", strio_set_pos, 1);
1272
- rb_define_method(StringIO, "rewind", strio_rewind, 0);
1273
- rb_define_method(StringIO, "seek", strio_seek, -1);
1274
- rb_define_method(StringIO, "sync", strio_get_sync, 0);
1275
- rb_define_method(StringIO, "sync=", strio_set_sync, 1);
1276
- rb_define_method(StringIO, "tell", strio_tell, 0);
1277
- rb_define_method(StringIO, "path", strio_path, 0);
1278
-
1279
- rb_define_method(StringIO, "each", strio_each, -1);
1280
- rb_define_method(StringIO, "each_byte", strio_each_byte, 0);
1281
- rb_define_method(StringIO, "each_line", strio_each, -1);
1282
- rb_define_method(StringIO, "getc", strio_getc, 0);
1283
- rb_define_method(StringIO, "ungetc", strio_ungetc, 1);
1284
- rb_define_method(StringIO, "readchar", strio_readchar, 0);
1285
- rb_define_method(StringIO, "gets", strio_gets, -1);
1286
- rb_define_method(StringIO, "readline", strio_readline, -1);
1287
- rb_define_method(StringIO, "readlines", strio_readlines, -1);
1288
- rb_define_method(StringIO, "read", strio_read, -1);
1289
- rb_define_method(StringIO, "sysread", strio_sysread, -1);
1290
-
1291
- rb_define_method(StringIO, "write", strio_write, 1);
1292
- rb_define_method(StringIO, "<<", strio_addstr, 1);
1293
- rb_define_method(StringIO, "print", strio_print, -1);
1294
- rb_define_method(StringIO, "printf", strio_printf, -1);
1295
- rb_define_method(StringIO, "putc", strio_putc, 1);
1296
- rb_define_method(StringIO, "puts", strio_puts, -1);
1297
- rb_define_method(StringIO, "syswrite", strio_syswrite, 1);
1298
-
1299
- rb_define_method(StringIO, "isatty", strio_isatty, 0);
1300
- rb_define_method(StringIO, "tty?", strio_isatty, 0);
1301
- rb_define_method(StringIO, "pid", strio_pid, 0);
1302
- rb_define_method(StringIO, "fileno", strio_fileno, 0);
1303
- rb_define_method(StringIO, "size", strio_size, 0);
1304
- rb_define_method(StringIO, "length", strio_size, 0);
1305
- rb_define_method(StringIO, "truncate", strio_truncate, 1);
1306
- }