Ruby  3.1.4p223 (2023-03-30 revision HEAD)
string.h
1 #ifndef INTERNAL_STRING_H /*-*-C-*-vi:se ft=c:*/
2 #define INTERNAL_STRING_H
11 #include "ruby/internal/config.h"
12 #include <stddef.h> /* for size_t */
13 #include "internal/compilers.h" /* for __has_builtin */
14 #include "ruby/internal/stdbool.h" /* for bool */
15 #include "ruby/encoding.h" /* for rb_encoding */
16 #include "ruby/ruby.h" /* for VALUE */
17 
18 #define STR_NOEMBED FL_USER1
19 #define STR_SHARED FL_USER2 /* = ELTS_SHARED */
20 
21 #ifdef rb_fstring_cstr
22 # undef rb_fstring_cstr
23 #endif
24 
25 /* string.c */
26 VALUE rb_fstring(VALUE);
27 VALUE rb_fstring_cstr(const char *str);
28 VALUE rb_fstring_enc_new(const char *ptr, long len, rb_encoding *enc);
29 int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p);
30 int rb_str_symname_p(VALUE);
31 VALUE rb_str_quote_unprintable(VALUE);
32 char *rb_str_fill_terminator(VALUE str, const int termlen);
33 void rb_str_change_terminator_length(VALUE str, const int oldtermlen, const int termlen);
34 VALUE rb_str_locktmp_ensure(VALUE str, VALUE (*func)(VALUE), VALUE arg);
35 VALUE rb_str_chomp_string(VALUE str, VALUE chomp);
36 VALUE rb_external_str_with_enc(VALUE str, rb_encoding *eenc);
37 VALUE rb_str_cat_conv_enc_opts(VALUE newstr, long ofs, const char *ptr, long len,
38  rb_encoding *from, int ecflags, VALUE ecopts);
39 VALUE rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl);
40 VALUE rb_str_escape(VALUE str);
41 size_t rb_str_memsize(VALUE);
42 char *rb_str_to_cstr(VALUE str);
43 const char *ruby_escaped_char(int c);
44 void rb_str_make_independent(VALUE str);
45 int rb_enc_str_coderange_scan(VALUE str, rb_encoding *enc);
46 
47 static inline bool STR_EMBED_P(VALUE str);
48 static inline bool STR_SHARED_P(VALUE str);
49 static inline VALUE QUOTE(VALUE v);
50 static inline VALUE QUOTE_ID(ID v);
51 static inline bool is_ascii_string(VALUE str);
52 static inline bool is_broken_string(VALUE str);
53 static inline VALUE rb_str_eql_internal(const VALUE str1, const VALUE str2);
54 
55 RUBY_SYMBOL_EXPORT_BEGIN
56 /* string.c (export) */
57 VALUE rb_str_tmp_frozen_acquire(VALUE str);
58 void rb_str_tmp_frozen_release(VALUE str, VALUE tmp);
59 VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb_encoding *enc);
60 VALUE rb_str_upto_each(VALUE, VALUE, int, int (*each)(VALUE, VALUE), VALUE);
61 VALUE rb_str_upto_endless_each(VALUE, int (*each)(VALUE, VALUE), VALUE);
62 RUBY_SYMBOL_EXPORT_END
63 
64 MJIT_SYMBOL_EXPORT_BEGIN
65 VALUE rb_fstring_new(const char *ptr, long len);
66 VALUE rb_obj_as_string_result(VALUE str, VALUE obj);
67 VALUE rb_str_opt_plus(VALUE x, VALUE y);
68 VALUE rb_str_concat_literals(size_t num, const VALUE *strary);
69 VALUE rb_str_eql(VALUE str1, VALUE str2);
70 VALUE rb_id_quote_unprintable(ID);
71 VALUE rb_sym_proc_call(ID mid, int argc, const VALUE *argv, int kw_splat, VALUE passed_proc);
72 
74 VALUE rb_ec_str_resurrect(struct rb_execution_context_struct *ec, VALUE str);
75 MJIT_SYMBOL_EXPORT_END
76 
77 #define rb_fstring_lit(str) rb_fstring_new((str), rb_strlen_lit(str))
78 #define rb_fstring_literal(str) rb_fstring_lit(str)
79 #define rb_fstring_enc_lit(str, enc) rb_fstring_enc_new((str), rb_strlen_lit(str), (enc))
80 #define rb_fstring_enc_literal(str, enc) rb_fstring_enc_lit(str, enc)
81 
82 static inline VALUE
83 QUOTE(VALUE v)
84 {
85  return rb_str_quote_unprintable(v);
86 }
87 
88 static inline VALUE
89 QUOTE_ID(ID i)
90 {
91  return rb_id_quote_unprintable(i);
92 }
93 
94 static inline bool
95 STR_EMBED_P(VALUE str)
96 {
97  return ! FL_TEST_RAW(str, STR_NOEMBED);
98 }
99 
100 static inline bool
101 STR_SHARED_P(VALUE str)
102 {
103  return FL_ALL_RAW(str, STR_NOEMBED | ELTS_SHARED);
104 }
105 
106 static inline bool
107 is_ascii_string(VALUE str)
108 {
110 }
111 
112 static inline bool
113 is_broken_string(VALUE str)
114 {
116 }
117 
118 /* expect tail call optimization */
119 // YJIT needs this function to never allocate and never raise
120 static inline VALUE
121 rb_str_eql_internal(const VALUE str1, const VALUE str2)
122 {
123  const long len = RSTRING_LEN(str1);
124  const char *ptr1, *ptr2;
125 
126  if (len != RSTRING_LEN(str2)) return Qfalse;
127  if (!rb_str_comparable(str1, str2)) return Qfalse;
128  if ((ptr1 = RSTRING_PTR(str1)) == (ptr2 = RSTRING_PTR(str2)))
129  return Qtrue;
130  if (memcmp(ptr1, ptr2, len) == 0)
131  return Qtrue;
132  return Qfalse;
133 }
134 
135 #if __has_builtin(__builtin_constant_p)
136 # define rb_fstring_cstr(str) \
137  (__builtin_constant_p(str) ? \
138  rb_fstring_new((str), (long)strlen(str)) : \
139  (rb_fstring_cstr)(str))
140 #endif
141 #endif /* INTERNAL_STRING_H */
#define ENC_CODERANGE_7BIT
Old name of RUBY_ENC_CODERANGE_7BIT.
Definition: coderange.h:180
#define ELTS_SHARED
Old name of RUBY_ELTS_SHARED.
Definition: fl_type.h:93
#define FL_TEST_RAW
Old name of RB_FL_TEST_RAW.
Definition: fl_type.h:140
#define Qtrue
Old name of RUBY_Qtrue.
#define Qfalse
Old name of RUBY_Qfalse.
#define ENC_CODERANGE_BROKEN
Old name of RUBY_ENC_CODERANGE_BROKEN.
Definition: coderange.h:182
#define FL_ALL_RAW
Old name of RB_FL_ALL_RAW.
Definition: fl_type.h:132
Encoding relates APIs.
int rb_enc_str_coderange(VALUE str)
Scans the passed string to collect its code range.
Definition: string.c:776
int rb_str_comparable(VALUE str1, VALUE str2)
Checks if two strings are comparable each other or not.
Definition: string.c:3557
static char * RSTRING_PTR(VALUE str)
Queries the contents pointer of the string.
Definition: rstring.h:497
static long RSTRING_LEN(VALUE str)
Queries the length of the string.
Definition: rstring.h:483
C99 shim for <stdbool.h>
Ruby's String.
Definition: rstring.h:231
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
Definition: value.h:52
uintptr_t VALUE
Type that represents a Ruby object.
Definition: value.h:40