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