1 #include "ruby.h"
2 #include "rubyspec.h"
3
4 #include <string.h>
5 #include <stdarg.h>
6
7 #ifdef HAVE_RUBY_ENCODING_H
8 #include "ruby/encoding.h"
9 #endif
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
15 /* Make sure the RSTRING_PTR and the bytes are in native memory.
16 * On TruffleRuby RSTRING_PTR and the bytes remain in managed memory
17 * until they must be written to native memory.
18 * In some specs we want to test using the native memory. */
NATIVE_RSTRING_PTR(VALUE str)19 char* NATIVE_RSTRING_PTR(VALUE str) {
20 char* ptr = RSTRING_PTR(str);
21 char** native = malloc(sizeof(char*));
22 *native = ptr;
23 ptr = *native;
24 free(native);
25 return ptr;
26 }
27
28 #ifdef HAVE_RB_CSTR2INUM
string_spec_rb_cstr2inum(VALUE self,VALUE str,VALUE inum)29 VALUE string_spec_rb_cstr2inum(VALUE self, VALUE str, VALUE inum) {
30 int num = FIX2INT(inum);
31 return rb_cstr2inum(RSTRING_PTR(str), num);
32 }
33 #endif
34
35 #ifdef HAVE_RB_CSTR_TO_INUM
string_spec_rb_cstr_to_inum(VALUE self,VALUE str,VALUE inum,VALUE badcheck)36 static VALUE string_spec_rb_cstr_to_inum(VALUE self, VALUE str, VALUE inum, VALUE badcheck) {
37 int num = FIX2INT(inum);
38 return rb_cstr_to_inum(RSTRING_PTR(str), num, RTEST(badcheck));
39 }
40 #endif
41
42 #ifdef HAVE_RB_STR2INUM
string_spec_rb_str2inum(VALUE self,VALUE str,VALUE inum)43 VALUE string_spec_rb_str2inum(VALUE self, VALUE str, VALUE inum) {
44 int num = FIX2INT(inum);
45 return rb_str2inum(str, num);
46 }
47 #endif
48
49 #ifdef HAVE_RB_STR_APPEND
string_spec_rb_str_append(VALUE self,VALUE str,VALUE str2)50 VALUE string_spec_rb_str_append(VALUE self, VALUE str, VALUE str2) {
51 return rb_str_append(str, str2);
52 }
53 #endif
54
55 #ifdef HAVE_RB_STR_SET_LEN
string_spec_rb_str_set_len(VALUE self,VALUE str,VALUE len)56 VALUE string_spec_rb_str_set_len(VALUE self, VALUE str, VALUE len) {
57 rb_str_set_len(str, NUM2LONG(len));
58
59 return str;
60 }
61
string_spec_rb_str_set_len_RSTRING_LEN(VALUE self,VALUE str,VALUE len)62 VALUE string_spec_rb_str_set_len_RSTRING_LEN(VALUE self, VALUE str, VALUE len) {
63 rb_str_set_len(str, NUM2LONG(len));
64
65 return INT2FIX(RSTRING_LEN(str));
66 }
67 #endif
68
69 #ifdef HAVE_RB_STR_BUF_NEW
string_spec_rb_str_buf_new(VALUE self,VALUE len,VALUE str)70 VALUE string_spec_rb_str_buf_new(VALUE self, VALUE len, VALUE str) {
71 VALUE buf;
72
73 buf = rb_str_buf_new(NUM2LONG(len));
74
75 if(RTEST(str)) {
76 snprintf(RSTRING_PTR(buf), NUM2LONG(len), "%s", RSTRING_PTR(str));
77 }
78
79 return buf;
80 }
81
string_spec_rb_str_capacity(VALUE self,VALUE str)82 VALUE string_spec_rb_str_capacity(VALUE self, VALUE str) {
83 return SIZET2NUM(rb_str_capacity(str));
84 }
85 #endif
86
87 #ifdef HAVE_RB_STR_BUF_NEW2
string_spec_rb_str_buf_new2(VALUE self)88 VALUE string_spec_rb_str_buf_new2(VALUE self) {
89 return rb_str_buf_new2("hello\0invisible");
90 }
91 #endif
92
93 #ifdef HAVE_RB_STR_BUF_CAT
string_spec_rb_str_buf_cat(VALUE self,VALUE str)94 VALUE string_spec_rb_str_buf_cat(VALUE self, VALUE str) {
95 const char *question_mark = "?";
96 rb_str_buf_cat(str, question_mark, strlen(question_mark));
97 return str;
98 }
99 #endif
100
101 #ifdef HAVE_RB_STR_CAT
string_spec_rb_str_cat(VALUE self,VALUE str)102 VALUE string_spec_rb_str_cat(VALUE self, VALUE str) {
103 return rb_str_cat(str, "?", 1);
104 }
105 #endif
106
107 #ifdef HAVE_RB_STR_CAT2
string_spec_rb_str_cat2(VALUE self,VALUE str)108 VALUE string_spec_rb_str_cat2(VALUE self, VALUE str) {
109 return rb_str_cat2(str, "?");
110 }
111 #endif
112
113 #ifdef HAVE_RB_STR_CMP
string_spec_rb_str_cmp(VALUE self,VALUE str1,VALUE str2)114 VALUE string_spec_rb_str_cmp(VALUE self, VALUE str1, VALUE str2) {
115 return INT2NUM(rb_str_cmp(str1, str2));
116 }
117 #endif
118
119 #ifdef HAVE_RB_STR_CONV_ENC
string_spec_rb_str_conv_enc(VALUE self,VALUE str,VALUE from,VALUE to)120 VALUE string_spec_rb_str_conv_enc(VALUE self, VALUE str, VALUE from, VALUE to) {
121 rb_encoding* from_enc;
122 rb_encoding* to_enc;
123
124 from_enc = rb_to_encoding(from);
125
126 if(NIL_P(to)) {
127 to_enc = 0;
128 } else {
129 to_enc = rb_to_encoding(to);
130 }
131
132 return rb_str_conv_enc(str, from_enc, to_enc);
133 }
134 #endif
135
136 #ifdef HAVE_RB_STR_CONV_ENC_OPTS
string_spec_rb_str_conv_enc_opts(VALUE self,VALUE str,VALUE from,VALUE to,VALUE ecflags,VALUE ecopts)137 VALUE string_spec_rb_str_conv_enc_opts(VALUE self, VALUE str, VALUE from, VALUE to,
138 VALUE ecflags, VALUE ecopts)
139 {
140 rb_encoding* from_enc;
141 rb_encoding* to_enc;
142
143 from_enc = rb_to_encoding(from);
144
145 if(NIL_P(to)) {
146 to_enc = 0;
147 } else {
148 to_enc = rb_to_encoding(to);
149 }
150
151 return rb_str_conv_enc_opts(str, from_enc, to_enc, FIX2INT(ecflags), ecopts);
152 }
153 #endif
154
155 #ifdef HAVE_RB_STR_EXPORT
string_spec_rb_str_export(VALUE self,VALUE str)156 VALUE string_spec_rb_str_export(VALUE self, VALUE str) {
157 return rb_str_export(str);
158 }
159 #endif
160
161 #ifdef HAVE_RB_STR_EXPORT_LOCALE
string_spec_rb_str_export_locale(VALUE self,VALUE str)162 VALUE string_spec_rb_str_export_locale(VALUE self, VALUE str) {
163 return rb_str_export_locale(str);
164 }
165 #endif
166
167 #ifdef HAVE_RB_STR_DUP
string_spec_rb_str_dup(VALUE self,VALUE str)168 VALUE string_spec_rb_str_dup(VALUE self, VALUE str) {
169 return rb_str_dup(str);
170 }
171 #endif
172
173 #ifdef HAVE_RB_STR_FREEZE
string_spec_rb_str_freeze(VALUE self,VALUE str)174 VALUE string_spec_rb_str_freeze(VALUE self, VALUE str) {
175 return rb_str_freeze(str);
176 }
177 #endif
178
179 #ifdef HAVE_RB_STR_INSPECT
string_spec_rb_str_inspect(VALUE self,VALUE str)180 VALUE string_spec_rb_str_inspect(VALUE self, VALUE str) {
181 return rb_str_inspect(str);
182 }
183 #endif
184
185 #ifdef HAVE_RB_STR_INTERN
string_spec_rb_str_intern(VALUE self,VALUE str)186 VALUE string_spec_rb_str_intern(VALUE self, VALUE str) {
187 return rb_str_intern(str);
188 }
189 #endif
190
191 #ifdef HAVE_RB_STR_LENGTH
string_spec_rb_str_length(VALUE self,VALUE str)192 VALUE string_spec_rb_str_length(VALUE self, VALUE str) {
193 return rb_str_length(str);
194 }
195 #endif
196
197 #ifdef HAVE_RB_STR_NEW
string_spec_rb_str_new(VALUE self,VALUE str,VALUE len)198 VALUE string_spec_rb_str_new(VALUE self, VALUE str, VALUE len) {
199 return rb_str_new(RSTRING_PTR(str), FIX2INT(len));
200 }
201
string_spec_rb_str_new_native(VALUE self,VALUE str,VALUE len)202 VALUE string_spec_rb_str_new_native(VALUE self, VALUE str, VALUE len) {
203 return rb_str_new(NATIVE_RSTRING_PTR(str), FIX2INT(len));
204 }
205
string_spec_rb_str_new_offset(VALUE self,VALUE str,VALUE offset,VALUE len)206 VALUE string_spec_rb_str_new_offset(VALUE self, VALUE str, VALUE offset, VALUE len) {
207 return rb_str_new(RSTRING_PTR(str) + FIX2INT(offset), FIX2INT(len));
208 }
209 #endif
210
211 #ifdef HAVE_RB_STR_NEW2
string_spec_rb_str_new2(VALUE self,VALUE str)212 VALUE string_spec_rb_str_new2(VALUE self, VALUE str) {
213 if(NIL_P(str)) {
214 return rb_str_new2("");
215 } else {
216 return rb_str_new2(RSTRING_PTR(str));
217 }
218 }
219 #endif
220
221 #ifdef HAVE_RB_STR_ENCODE
string_spec_rb_str_encode(VALUE self,VALUE str,VALUE enc,VALUE flags,VALUE opts)222 VALUE string_spec_rb_str_encode(VALUE self, VALUE str, VALUE enc, VALUE flags, VALUE opts) {
223 return rb_str_encode(str, enc, FIX2INT(flags), opts);
224 }
225 #endif
226
227 #ifdef HAVE_RB_STR_NEW_CSTR
string_spec_rb_str_new_cstr(VALUE self,VALUE str)228 VALUE string_spec_rb_str_new_cstr(VALUE self, VALUE str) {
229 if(NIL_P(str)) {
230 return rb_str_new_cstr("");
231 } else {
232 return rb_str_new_cstr(RSTRING_PTR(str));
233 }
234 }
235 #endif
236
237 #ifdef HAVE_RB_EXTERNAL_STR_NEW
string_spec_rb_external_str_new(VALUE self,VALUE str)238 VALUE string_spec_rb_external_str_new(VALUE self, VALUE str) {
239 return rb_external_str_new(RSTRING_PTR(str), RSTRING_LEN(str));
240 }
241 #endif
242
243 #ifdef HAVE_RB_EXTERNAL_STR_NEW_CSTR
string_spec_rb_external_str_new_cstr(VALUE self,VALUE str)244 VALUE string_spec_rb_external_str_new_cstr(VALUE self, VALUE str) {
245 return rb_external_str_new_cstr(RSTRING_PTR(str));
246 }
247 #endif
248
249 #ifdef HAVE_RB_EXTERNAL_STR_NEW_WITH_ENC
string_spec_rb_external_str_new_with_enc(VALUE self,VALUE str,VALUE len,VALUE encoding)250 VALUE string_spec_rb_external_str_new_with_enc(VALUE self, VALUE str, VALUE len, VALUE encoding) {
251 return rb_external_str_new_with_enc(RSTRING_PTR(str), FIX2LONG(len), rb_to_encoding(encoding));
252 }
253 #endif
254
255 #ifdef HAVE_RB_LOCALE_STR_NEW
string_spec_rb_locale_str_new(VALUE self,VALUE str,VALUE len)256 VALUE string_spec_rb_locale_str_new(VALUE self, VALUE str, VALUE len) {
257 return rb_locale_str_new(RSTRING_PTR(str), FIX2INT(len));
258 }
259 #endif
260
261 #ifdef HAVE_RB_LOCALE_STR_NEW_CSTR
string_spec_rb_locale_str_new_cstr(VALUE self,VALUE str)262 VALUE string_spec_rb_locale_str_new_cstr(VALUE self, VALUE str) {
263 return rb_locale_str_new_cstr(RSTRING_PTR(str));
264 }
265 #endif
266
267 #ifdef HAVE_RB_STR_NEW3
string_spec_rb_str_new3(VALUE self,VALUE str)268 VALUE string_spec_rb_str_new3(VALUE self, VALUE str) {
269 return rb_str_new3(str);
270 }
271 #endif
272
273 #ifdef HAVE_RB_STR_NEW4
string_spec_rb_str_new4(VALUE self,VALUE str)274 VALUE string_spec_rb_str_new4(VALUE self, VALUE str) {
275 return rb_str_new4(str);
276 }
277 #endif
278
279 #ifdef HAVE_RB_STR_NEW5
string_spec_rb_str_new5(VALUE self,VALUE str,VALUE ptr,VALUE len)280 VALUE string_spec_rb_str_new5(VALUE self, VALUE str, VALUE ptr, VALUE len) {
281 return rb_str_new5(str, RSTRING_PTR(ptr), FIX2INT(len));
282 }
283 #endif
284
285 #ifdef HAVE_RB_TAINTED_STR_NEW
string_spec_rb_tainted_str_new(VALUE self,VALUE str,VALUE len)286 VALUE string_spec_rb_tainted_str_new(VALUE self, VALUE str, VALUE len) {
287 return rb_tainted_str_new(RSTRING_PTR(str), FIX2INT(len));
288 }
289 #endif
290
291 #ifdef HAVE_RB_TAINTED_STR_NEW2
string_spec_rb_tainted_str_new2(VALUE self,VALUE str)292 VALUE string_spec_rb_tainted_str_new2(VALUE self, VALUE str) {
293 return rb_tainted_str_new2(RSTRING_PTR(str));
294 }
295 #endif
296
297 #ifdef HAVE_RB_STR_PLUS
string_spec_rb_str_plus(VALUE self,VALUE str1,VALUE str2)298 VALUE string_spec_rb_str_plus(VALUE self, VALUE str1, VALUE str2) {
299 return rb_str_plus(str1, str2);
300 }
301 #endif
302
303 #ifdef HAVE_RB_STR_TIMES
string_spec_rb_str_times(VALUE self,VALUE str,VALUE times)304 VALUE string_spec_rb_str_times(VALUE self, VALUE str, VALUE times) {
305 return rb_str_times(str, times);
306 }
307 #endif
308
309 #ifdef HAVE_RB_STR_RESIZE
string_spec_rb_str_resize(VALUE self,VALUE str,VALUE size)310 VALUE string_spec_rb_str_resize(VALUE self, VALUE str, VALUE size) {
311 return rb_str_resize(str, FIX2INT(size));
312 }
313
string_spec_rb_str_resize_RSTRING_LEN(VALUE self,VALUE str,VALUE size)314 VALUE string_spec_rb_str_resize_RSTRING_LEN(VALUE self, VALUE str, VALUE size) {
315 VALUE modified = rb_str_resize(str, FIX2INT(size));
316 return INT2FIX(RSTRING_LEN(modified));
317 }
318 #endif
319
320 #ifdef HAVE_RB_STR_SPLIT
string_spec_rb_str_split(VALUE self,VALUE str)321 VALUE string_spec_rb_str_split(VALUE self, VALUE str) {
322 return rb_str_split(str, ",");
323 }
324 #endif
325
326 #ifdef HAVE_RB_STR_SUBSEQ
string_spec_rb_str_subseq(VALUE self,VALUE str,VALUE beg,VALUE len)327 VALUE string_spec_rb_str_subseq(VALUE self, VALUE str, VALUE beg, VALUE len) {
328 return rb_str_subseq(str, FIX2INT(beg), FIX2INT(len));
329 }
330 #endif
331
332 #ifdef HAVE_RB_STR_SUBSTR
string_spec_rb_str_substr(VALUE self,VALUE str,VALUE beg,VALUE len)333 VALUE string_spec_rb_str_substr(VALUE self, VALUE str, VALUE beg, VALUE len) {
334 return rb_str_substr(str, FIX2INT(beg), FIX2INT(len));
335 }
336 #endif
337
338 #ifdef HAVE_RB_STR_TO_STR
string_spec_rb_str_to_str(VALUE self,VALUE arg)339 VALUE string_spec_rb_str_to_str(VALUE self, VALUE arg) {
340 return rb_str_to_str(arg);
341 }
342 #endif
343
344 #ifdef HAVE_RSTRING_LEN
string_spec_RSTRING_LEN(VALUE self,VALUE str)345 VALUE string_spec_RSTRING_LEN(VALUE self, VALUE str) {
346 return INT2FIX(RSTRING_LEN(str));
347 }
348 #endif
349
350 #ifdef HAVE_RSTRING_LENINT
string_spec_RSTRING_LENINT(VALUE self,VALUE str)351 VALUE string_spec_RSTRING_LENINT(VALUE self, VALUE str) {
352 return INT2FIX(RSTRING_LENINT(str));
353 }
354 #endif
355
356 #ifdef HAVE_RSTRING_PTR
string_spec_RSTRING_PTR_iterate(VALUE self,VALUE str)357 VALUE string_spec_RSTRING_PTR_iterate(VALUE self, VALUE str) {
358 int i;
359 char* ptr;
360
361 ptr = RSTRING_PTR(str);
362 for(i = 0; i < RSTRING_LEN(str); i++) {
363 rb_yield(CHR2FIX(ptr[i]));
364 }
365 return Qnil;
366 }
367
string_spec_RSTRING_PTR_assign(VALUE self,VALUE str,VALUE chr)368 VALUE string_spec_RSTRING_PTR_assign(VALUE self, VALUE str, VALUE chr) {
369 int i;
370 char c;
371 char* ptr;
372
373 ptr = RSTRING_PTR(str);
374 c = FIX2INT(chr);
375
376 for(i = 0; i < RSTRING_LEN(str); i++) {
377 ptr[i] = c;
378 }
379 return Qnil;
380 }
381
string_spec_RSTRING_PTR_set(VALUE self,VALUE str,VALUE i,VALUE chr)382 VALUE string_spec_RSTRING_PTR_set(VALUE self, VALUE str, VALUE i, VALUE chr) {
383 RSTRING_PTR(str)[FIX2INT(i)] = (char) FIX2INT(chr);
384 return str;
385 }
386
string_spec_RSTRING_PTR_after_funcall(VALUE self,VALUE str,VALUE cb)387 VALUE string_spec_RSTRING_PTR_after_funcall(VALUE self, VALUE str, VALUE cb) {
388 /* Silence gcc 4.3.2 warning about computed value not used */
389 if(RSTRING_PTR(str)) { /* force it out */
390 rb_funcall(cb, rb_intern("call"), 1, str);
391 }
392
393 return rb_str_new2(RSTRING_PTR(str));
394 }
395
string_spec_RSTRING_PTR_after_yield(VALUE self,VALUE str)396 VALUE string_spec_RSTRING_PTR_after_yield(VALUE self, VALUE str) {
397 char* ptr = NATIVE_RSTRING_PTR(str);
398 long len = RSTRING_LEN(str);
399 VALUE from_rstring_ptr;
400
401 ptr[0] = '1';
402 rb_yield(str);
403 ptr[2] = '2';
404
405 from_rstring_ptr = rb_str_new(ptr, len);
406 return from_rstring_ptr;
407 }
408 #endif
409
410 #ifdef HAVE_STRINGVALUE
string_spec_StringValue(VALUE self,VALUE str)411 VALUE string_spec_StringValue(VALUE self, VALUE str) {
412 return StringValue(str);
413 }
414 #endif
415
416 #ifdef HAVE_SAFE_STRING_VALUE
string_spec_SafeStringValue(VALUE self,VALUE str)417 static VALUE string_spec_SafeStringValue(VALUE self, VALUE str) {
418 SafeStringValue(str);
419 return str;
420 }
421 #endif
422
423 #ifdef HAVE_RB_STR_HASH
string_spec_rb_str_hash(VALUE self,VALUE str)424 static VALUE string_spec_rb_str_hash(VALUE self, VALUE str) {
425 st_index_t val = rb_str_hash(str);
426
427 #if SIZEOF_LONG == SIZEOF_VOIDP || SIZEOF_LONG_LONG == SIZEOF_VOIDP
428 return LONG2FIX((long)val);
429 #else
430 # error unsupported platform
431 #endif
432 }
433 #endif
434
435 #ifdef HAVE_RB_STR_UPDATE
string_spec_rb_str_update(VALUE self,VALUE str,VALUE beg,VALUE end,VALUE replacement)436 static VALUE string_spec_rb_str_update(VALUE self, VALUE str, VALUE beg, VALUE end, VALUE replacement) {
437 rb_str_update(str, FIX2LONG(beg), FIX2LONG(end), replacement);
438 return str;
439 }
440 #endif
441
442 #ifdef HAVE_RB_STR_FREE
string_spec_rb_str_free(VALUE self,VALUE str)443 static VALUE string_spec_rb_str_free(VALUE self, VALUE str) {
444 rb_str_free(str);
445 return Qnil;
446 }
447 #endif
448
449 #ifdef HAVE_RB_SPRINTF
string_spec_rb_sprintf1(VALUE self,VALUE str,VALUE repl)450 static VALUE string_spec_rb_sprintf1(VALUE self, VALUE str, VALUE repl) {
451 return rb_sprintf(RSTRING_PTR(str), RSTRING_PTR(repl));
452 }
string_spec_rb_sprintf2(VALUE self,VALUE str,VALUE repl1,VALUE repl2)453 static VALUE string_spec_rb_sprintf2(VALUE self, VALUE str, VALUE repl1, VALUE repl2) {
454 return rb_sprintf(RSTRING_PTR(str), RSTRING_PTR(repl1), RSTRING_PTR(repl2));
455 }
456 #endif
457
458 #ifdef HAVE_RB_VSPRINTF
string_spec_rb_vsprintf_worker(char * fmt,...)459 static VALUE string_spec_rb_vsprintf_worker(char* fmt, ...) {
460 va_list varargs;
461 VALUE str;
462
463 va_start(varargs, fmt);
464 str = rb_vsprintf(fmt, varargs);
465 va_end(varargs);
466
467 return str;
468 }
469
string_spec_rb_vsprintf(VALUE self,VALUE fmt,VALUE str,VALUE i,VALUE f)470 static VALUE string_spec_rb_vsprintf(VALUE self, VALUE fmt, VALUE str, VALUE i, VALUE f) {
471 return string_spec_rb_vsprintf_worker(RSTRING_PTR(fmt), RSTRING_PTR(str),
472 FIX2INT(i), RFLOAT_VALUE(f));
473 }
474 #endif
475
476 #ifdef HAVE_RB_STR_EQUAL
string_spec_rb_str_equal(VALUE self,VALUE str1,VALUE str2)477 VALUE string_spec_rb_str_equal(VALUE self, VALUE str1, VALUE str2) {
478 return rb_str_equal(str1, str2);
479 }
480 #endif
481
482 #ifdef HAVE_RB_USASCII_STR_NEW
string_spec_rb_usascii_str_new(VALUE self,VALUE str,VALUE len)483 static VALUE string_spec_rb_usascii_str_new(VALUE self, VALUE str, VALUE len) {
484 return rb_usascii_str_new(RSTRING_PTR(str), NUM2INT(len));
485 }
486 #endif
487
488 #ifdef HAVE_RB_USASCII_STR_NEW_CSTR
string_spec_rb_usascii_str_new_cstr(VALUE self,VALUE str)489 static VALUE string_spec_rb_usascii_str_new_cstr(VALUE self, VALUE str) {
490 return rb_usascii_str_new_cstr(RSTRING_PTR(str));
491 }
492 #endif
493
494 #ifdef HAVE_RB_STRING
string_spec_rb_String(VALUE self,VALUE val)495 static VALUE string_spec_rb_String(VALUE self, VALUE val) {
496 return rb_String(val);
497 }
498 #endif
499
500 #ifdef HAVE_RB_STRING_VALUE_CSTR
string_spec_rb_string_value_cstr(VALUE self,VALUE str)501 static VALUE string_spec_rb_string_value_cstr(VALUE self, VALUE str) {
502 char *c_str = rb_string_value_cstr(&str);
503 return c_str ? Qtrue : Qfalse;
504 }
505 #endif
506
Init_string_spec(void)507 void Init_string_spec(void) {
508 VALUE cls;
509 cls = rb_define_class("CApiStringSpecs", rb_cObject);
510
511 #ifdef HAVE_RB_CSTR2INUM
512 rb_define_method(cls, "rb_cstr2inum", string_spec_rb_cstr2inum, 2);
513 #endif
514
515 #ifdef HAVE_RB_CSTR_TO_INUM
516 rb_define_method(cls, "rb_cstr_to_inum", string_spec_rb_cstr_to_inum, 3);
517 #endif
518
519 #ifdef HAVE_RB_STR2INUM
520 rb_define_method(cls, "rb_str2inum", string_spec_rb_str2inum, 2);
521 #endif
522
523 #ifdef HAVE_RB_STR_APPEND
524 rb_define_method(cls, "rb_str_append", string_spec_rb_str_append, 2);
525 #endif
526
527 #ifdef HAVE_RB_STR_BUF_NEW
528 rb_define_method(cls, "rb_str_buf_new", string_spec_rb_str_buf_new, 2);
529 rb_define_method(cls, "rb_str_capacity", string_spec_rb_str_capacity, 1);
530 #endif
531
532 #ifdef HAVE_RB_STR_BUF_NEW2
533 rb_define_method(cls, "rb_str_buf_new2", string_spec_rb_str_buf_new2, 0);
534 #endif
535
536 #ifdef HAVE_RB_STR_BUF_CAT
537 rb_define_method(cls, "rb_str_buf_cat", string_spec_rb_str_buf_cat, 1);
538 #endif
539
540 #ifdef HAVE_RB_STR_CAT
541 rb_define_method(cls, "rb_str_cat", string_spec_rb_str_cat, 1);
542 #endif
543
544 #ifdef HAVE_RB_STR_CAT2
545 rb_define_method(cls, "rb_str_cat2", string_spec_rb_str_cat2, 1);
546 #endif
547
548 #ifdef HAVE_RB_STR_CMP
549 rb_define_method(cls, "rb_str_cmp", string_spec_rb_str_cmp, 2);
550 #endif
551
552 #ifdef HAVE_RB_STR_CONV_ENC
553 rb_define_method(cls, "rb_str_conv_enc", string_spec_rb_str_conv_enc, 3);
554 #endif
555
556 #ifdef HAVE_RB_STR_CONV_ENC_OPTS
557 rb_define_method(cls, "rb_str_conv_enc_opts", string_spec_rb_str_conv_enc_opts, 5);
558 #endif
559
560 #ifdef HAVE_RB_STR_EXPORT
561 rb_define_method(cls, "rb_str_export", string_spec_rb_str_export, 1);
562 #endif
563
564 #ifdef HAVE_RB_STR_EXPORT_LOCALE
565 rb_define_method(cls, "rb_str_export_locale", string_spec_rb_str_export_locale, 1);
566 #endif
567
568 #ifdef HAVE_RB_STR_DUP
569 rb_define_method(cls, "rb_str_dup", string_spec_rb_str_dup, 1);
570 #endif
571
572 #ifdef HAVE_RB_STR_FREEZE
573 rb_define_method(cls, "rb_str_freeze", string_spec_rb_str_freeze, 1);
574 #endif
575
576 #ifdef HAVE_RB_STR_INSPECT
577 rb_define_method(cls, "rb_str_inspect", string_spec_rb_str_inspect, 1);
578 #endif
579
580 #ifdef HAVE_RB_STR_INTERN
581 rb_define_method(cls, "rb_str_intern", string_spec_rb_str_intern, 1);
582 #endif
583
584 #ifdef HAVE_RB_STR_LENGTH
585 rb_define_method(cls, "rb_str_length", string_spec_rb_str_length, 1);
586 #endif
587
588 #ifdef HAVE_RB_STR_NEW
589 rb_define_method(cls, "rb_str_new", string_spec_rb_str_new, 2);
590 rb_define_method(cls, "rb_str_new_native", string_spec_rb_str_new_native, 2);
591 rb_define_method(cls, "rb_str_new_offset", string_spec_rb_str_new_offset, 3);
592 #endif
593
594 #ifdef HAVE_RB_STR_NEW2
595 rb_define_method(cls, "rb_str_new2", string_spec_rb_str_new2, 1);
596 #endif
597
598 #ifdef HAVE_RB_STR_ENCODE
599 rb_define_method(cls, "rb_str_encode", string_spec_rb_str_encode, 4);
600 #endif
601
602 #ifdef HAVE_RB_STR_NEW_CSTR
603 rb_define_method(cls, "rb_str_new_cstr", string_spec_rb_str_new_cstr, 1);
604 #endif
605
606 #ifdef HAVE_RB_EXTERNAL_STR_NEW
607 rb_define_method(cls, "rb_external_str_new", string_spec_rb_external_str_new, 1);
608 #endif
609
610 #ifdef HAVE_RB_EXTERNAL_STR_NEW_CSTR
611 rb_define_method(cls, "rb_external_str_new_cstr",
612 string_spec_rb_external_str_new_cstr, 1);
613 #endif
614
615 #ifdef HAVE_RB_EXTERNAL_STR_NEW_WITH_ENC
616 rb_define_method(cls, "rb_external_str_new_with_enc", string_spec_rb_external_str_new_with_enc, 3);
617 #endif
618
619 #ifdef HAVE_RB_LOCALE_STR_NEW
620 rb_define_method(cls, "rb_locale_str_new", string_spec_rb_locale_str_new, 2);
621 #endif
622
623 #ifdef HAVE_RB_LOCALE_STR_NEW_CSTR
624 rb_define_method(cls, "rb_locale_str_new_cstr", string_spec_rb_locale_str_new_cstr, 1);
625 #endif
626
627 #ifdef HAVE_RB_STR_NEW3
628 rb_define_method(cls, "rb_str_new3", string_spec_rb_str_new3, 1);
629 #endif
630
631 #ifdef HAVE_RB_STR_NEW4
632 rb_define_method(cls, "rb_str_new4", string_spec_rb_str_new4, 1);
633 #endif
634
635 #ifdef HAVE_RB_STR_NEW5
636 rb_define_method(cls, "rb_str_new5", string_spec_rb_str_new5, 3);
637 #endif
638
639 #ifdef HAVE_RB_TAINTED_STR_NEW
640 rb_define_method(cls, "rb_tainted_str_new", string_spec_rb_tainted_str_new, 2);
641 #endif
642
643 #ifdef HAVE_RB_TAINTED_STR_NEW2
644 rb_define_method(cls, "rb_tainted_str_new2", string_spec_rb_tainted_str_new2, 1);
645 #endif
646
647 #ifdef HAVE_RB_STR_PLUS
648 rb_define_method(cls, "rb_str_plus", string_spec_rb_str_plus, 2);
649 #endif
650
651 #ifdef HAVE_RB_STR_TIMES
652 rb_define_method(cls, "rb_str_times", string_spec_rb_str_times, 2);
653 #endif
654
655 #ifdef HAVE_RB_STR_RESIZE
656 rb_define_method(cls, "rb_str_resize", string_spec_rb_str_resize, 2);
657 rb_define_method(cls, "rb_str_resize_RSTRING_LEN",
658 string_spec_rb_str_resize_RSTRING_LEN, 2);
659 #endif
660
661 #ifdef HAVE_RB_STR_SET_LEN
662 rb_define_method(cls, "rb_str_set_len", string_spec_rb_str_set_len, 2);
663 rb_define_method(cls, "rb_str_set_len_RSTRING_LEN",
664 string_spec_rb_str_set_len_RSTRING_LEN, 2);
665 #endif
666
667 #ifdef HAVE_RB_STR_SPLIT
668 rb_define_method(cls, "rb_str_split", string_spec_rb_str_split, 1);
669 #endif
670
671 #ifdef HAVE_RB_STR_SUBSEQ
672 rb_define_method(cls, "rb_str_subseq", string_spec_rb_str_subseq, 3);
673 #endif
674
675 #ifdef HAVE_RB_STR_SUBSTR
676 rb_define_method(cls, "rb_str_substr", string_spec_rb_str_substr, 3);
677 #endif
678
679 #ifdef HAVE_RB_STR_TO_STR
680 rb_define_method(cls, "rb_str_to_str", string_spec_rb_str_to_str, 1);
681 #endif
682
683 #ifdef HAVE_RSTRING_LEN
684 rb_define_method(cls, "RSTRING_LEN", string_spec_RSTRING_LEN, 1);
685 #endif
686
687 #ifdef HAVE_RSTRING_LENINT
688 rb_define_method(cls, "RSTRING_LENINT", string_spec_RSTRING_LENINT, 1);
689 #endif
690
691 #ifdef HAVE_RSTRING_PTR
692 rb_define_method(cls, "RSTRING_PTR_iterate", string_spec_RSTRING_PTR_iterate, 1);
693 rb_define_method(cls, "RSTRING_PTR_assign", string_spec_RSTRING_PTR_assign, 2);
694 rb_define_method(cls, "RSTRING_PTR_set", string_spec_RSTRING_PTR_set, 3);
695 rb_define_method(cls, "RSTRING_PTR_after_funcall", string_spec_RSTRING_PTR_after_funcall, 2);
696 rb_define_method(cls, "RSTRING_PTR_after_yield", string_spec_RSTRING_PTR_after_yield, 1);
697 #endif
698
699 #ifdef HAVE_STRINGVALUE
700 rb_define_method(cls, "StringValue", string_spec_StringValue, 1);
701 #endif
702
703 #ifdef HAVE_SAFE_STRING_VALUE
704 rb_define_method(cls, "SafeStringValue", string_spec_SafeStringValue, 1);
705 #endif
706
707 #ifdef HAVE_RB_STR_HASH
708 rb_define_method(cls, "rb_str_hash", string_spec_rb_str_hash, 1);
709 #endif
710
711 #ifdef HAVE_RB_STR_UPDATE
712 rb_define_method(cls, "rb_str_update", string_spec_rb_str_update, 4);
713 #endif
714
715 #ifdef HAVE_RB_STR_FREE
716 rb_define_method(cls, "rb_str_free", string_spec_rb_str_free, 1);
717 #endif
718
719 #ifdef HAVE_RB_SPRINTF
720 rb_define_method(cls, "rb_sprintf1", string_spec_rb_sprintf1, 2);
721 rb_define_method(cls, "rb_sprintf2", string_spec_rb_sprintf2, 3);
722 #endif
723
724 #ifdef HAVE_RB_VSPRINTF
725 rb_define_method(cls, "rb_vsprintf", string_spec_rb_vsprintf, 4);
726 #endif
727
728 #ifdef HAVE_RB_STR_EQUAL
729 rb_define_method(cls, "rb_str_equal", string_spec_rb_str_equal, 2);
730 #endif
731
732 #ifdef HAVE_RB_USASCII_STR_NEW
733 rb_define_method(cls, "rb_usascii_str_new", string_spec_rb_usascii_str_new, 2);
734 #endif
735
736 #ifdef HAVE_RB_USASCII_STR_NEW_CSTR
737 rb_define_method(cls, "rb_usascii_str_new_cstr", string_spec_rb_usascii_str_new_cstr, 1);
738 #endif
739
740 #ifdef HAVE_RB_STRING
741 rb_define_method(cls, "rb_String", string_spec_rb_String, 1);
742 #endif
743
744 #ifdef HAVE_RB_STRING_VALUE_CSTR
745 rb_define_method(cls, "rb_string_value_cstr", string_spec_rb_string_value_cstr, 1);
746 #endif
747 }
748 #ifdef __cplusplus
749 }
750 #endif
751