Ruby 3.3.6p108 (2024-11-05 revision 75015d4c1f6965b5e85e96fb309f1f2129f933c0)
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 */
26VALUE rb_fstring(VALUE);
27VALUE rb_fstring_cstr(const char *str);
28VALUE rb_fstring_enc_new(const char *ptr, long len, rb_encoding *enc);
29int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p);
30int rb_str_symname_p(VALUE);
31VALUE rb_str_quote_unprintable(VALUE);
32char *rb_str_fill_terminator(VALUE str, const int termlen);
33void rb_str_change_terminator_length(VALUE str, const int oldtermlen, const int termlen);
34VALUE rb_str_locktmp_ensure(VALUE str, VALUE (*func)(VALUE), VALUE arg);
35VALUE rb_str_chomp_string(VALUE str, VALUE chomp);
36VALUE rb_external_str_with_enc(VALUE str, rb_encoding *eenc);
37VALUE rb_str_cat_conv_enc_opts(VALUE newstr, long ofs, const char *ptr, long len,
38 rb_encoding *from, int ecflags, VALUE ecopts);
39VALUE rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl);
40VALUE rb_str_escape(VALUE str);
41size_t rb_str_memsize(VALUE);
42char *rb_str_to_cstr(VALUE str);
43const char *ruby_escaped_char(int c);
44void rb_str_make_independent(VALUE str);
45int rb_enc_str_coderange_scan(VALUE str, rb_encoding *enc);
46int rb_ascii8bit_appendable_encoding_index(rb_encoding *enc, unsigned int code);
47VALUE rb_str_include(VALUE str, VALUE arg);
48
49static inline bool STR_EMBED_P(VALUE str);
50static inline bool STR_SHARED_P(VALUE str);
51static inline VALUE QUOTE(VALUE v);
52static inline VALUE QUOTE_ID(ID v);
53static inline bool is_ascii_string(VALUE str);
54static inline bool is_broken_string(VALUE str);
55static inline VALUE rb_str_eql_internal(const VALUE str1, const VALUE str2);
56
57RUBY_SYMBOL_EXPORT_BEGIN
58/* string.c (export) */
59VALUE rb_str_tmp_frozen_acquire(VALUE str);
60VALUE rb_str_tmp_frozen_no_embed_acquire(VALUE str);
61void rb_str_tmp_frozen_release(VALUE str, VALUE tmp);
62VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb_encoding *enc);
63VALUE rb_str_upto_each(VALUE, VALUE, int, int (*each)(VALUE, VALUE), VALUE);
64VALUE rb_str_upto_endless_each(VALUE, int (*each)(VALUE, VALUE), VALUE);
65void rb_str_make_embedded(VALUE);
66size_t rb_str_size_as_embedded(VALUE);
67bool rb_str_reembeddable_p(VALUE);
68RUBY_SYMBOL_EXPORT_END
69
70VALUE rb_fstring_new(const char *ptr, long len);
71VALUE rb_obj_as_string_result(VALUE str, VALUE obj);
72VALUE rb_str_opt_plus(VALUE x, VALUE y);
73VALUE rb_str_concat_literals(size_t num, const VALUE *strary);
74VALUE rb_str_eql(VALUE str1, VALUE str2);
75VALUE rb_id_quote_unprintable(ID);
76VALUE rb_sym_proc_call(ID mid, int argc, const VALUE *argv, int kw_splat, VALUE passed_proc);
77
79VALUE rb_ec_str_resurrect(struct rb_execution_context_struct *ec, VALUE str);
80
81#define rb_fstring_lit(str) rb_fstring_new((str), rb_strlen_lit(str))
82#define rb_fstring_literal(str) rb_fstring_lit(str)
83#define rb_fstring_enc_lit(str, enc) rb_fstring_enc_new((str), rb_strlen_lit(str), (enc))
84#define rb_fstring_enc_literal(str, enc) rb_fstring_enc_lit(str, enc)
85
86static inline VALUE
87QUOTE(VALUE v)
88{
89 return rb_str_quote_unprintable(v);
90}
91
92static inline VALUE
93QUOTE_ID(ID i)
94{
95 return rb_id_quote_unprintable(i);
96}
97
98static inline bool
99STR_EMBED_P(VALUE str)
100{
101 return ! FL_TEST_RAW(str, STR_NOEMBED);
102}
103
104static inline bool
105STR_SHARED_P(VALUE str)
106{
107 return FL_ALL_RAW(str, STR_NOEMBED | STR_SHARED);
108}
109
110static inline bool
111is_ascii_string(VALUE str)
112{
113 return rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT;
114}
115
116static inline bool
117is_broken_string(VALUE str)
118{
119 return rb_enc_str_coderange(str) == ENC_CODERANGE_BROKEN;
120}
121
122static inline bool
123at_char_boundary(const char *s, const char *p, const char *e, rb_encoding *enc)
124{
125 return rb_enc_left_char_head(s, p, e, enc) == p;
126}
127
128static inline bool
129at_char_right_boundary(const char *s, const char *p, const char *e, rb_encoding *enc)
130{
131 RUBY_ASSERT(s <= p);
132 RUBY_ASSERT(p <= e);
133
134 return rb_enc_right_char_head(s, p, e, enc) == p;
135}
136
137/* expect tail call optimization */
138// YJIT needs this function to never allocate and never raise
139static inline VALUE
140rb_str_eql_internal(const VALUE str1, const VALUE str2)
141{
142 const long len = RSTRING_LEN(str1);
143 const char *ptr1, *ptr2;
144
145 if (len != RSTRING_LEN(str2)) return Qfalse;
146 if (!rb_str_comparable(str1, str2)) return Qfalse;
147 if ((ptr1 = RSTRING_PTR(str1)) == (ptr2 = RSTRING_PTR(str2)))
148 return Qtrue;
149 if (memcmp(ptr1, ptr2, len) == 0)
150 return Qtrue;
151 return Qfalse;
152}
153
154#if __has_builtin(__builtin_constant_p)
155# define rb_fstring_cstr(str) \
156 (__builtin_constant_p(str) ? \
157 rb_fstring_new((str), (long)strlen(str)) : \
158 (rb_fstring_cstr)(str))
159#endif
160#endif /* INTERNAL_STRING_H */
#define RUBY_ASSERT(expr)
Asserts that the given expression is truthy if and only if RUBY_DEBUG is truthy.
Definition assert.h:177
#define ENC_CODERANGE_7BIT
Old name of RUBY_ENC_CODERANGE_7BIT.
Definition coderange.h:180
#define FL_TEST_RAW
Old name of RB_FL_TEST_RAW.
Definition fl_type.h:132
#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:124
Encoding relates APIs.
static char * rb_enc_left_char_head(const char *s, const char *p, const char *e, rb_encoding *enc)
Queries the left boundary of a character.
Definition encoding.h:682
static char * rb_enc_right_char_head(const char *s, const char *p, const char *e, rb_encoding *enc)
Queries the right boundary of a character.
Definition encoding.h:703
int rb_str_comparable(VALUE str1, VALUE str2)
Checks if two strings are comparable each other or not.
Definition string.c:3660
int len
Length of the buffer.
Definition io.h:8
C99 shim for <stdbool.h>
Ruby's String.
Definition rstring.h:196
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