Ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c52d4d35cc6a173c89eda98ceffa2dcf)
string.h
Go to the documentation of this file.
1#ifndef INTERNAL_STRING_H /*-*-C-*-vi:se ft=c:*/
2#define INTERNAL_STRING_H
13#include <stddef.h> /* for size_t */
14#include "internal/compilers.h" /* for __has_builtin */
15#include "ruby/internal/stdbool.h" /* for bool */
16#include "ruby/encoding.h" /* for rb_encoding */
17#include "ruby/ruby.h" /* for VALUE */
18
19#define STR_NOEMBED FL_USER1
20#define STR_SHARED FL_USER2 /* = ELTS_SHARED */
21
22#ifdef rb_fstring_cstr
23# undef rb_fstring_cstr
24#endif
25
26/* string.c */
28VALUE rb_fstring_cstr(const char *str);
29VALUE rb_fstring_enc_new(const char *ptr, long len, rb_encoding *enc);
30int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p);
33char *rb_str_fill_terminator(VALUE str, const int termlen);
34void rb_str_change_terminator_length(VALUE str, const int oldtermlen, const int termlen);
38VALUE rb_str_cat_conv_enc_opts(VALUE newstr, long ofs, const char *ptr, long len,
39 rb_encoding *from, int ecflags, VALUE ecopts);
41VALUE rb_str_initialize(VALUE str, const char *ptr, long len, rb_encoding *enc);
42size_t rb_str_memsize(VALUE);
44const char *ruby_escaped_char(int c);
47
48static inline bool STR_EMBED_P(VALUE str);
49static inline bool STR_SHARED_P(VALUE str);
50static inline VALUE QUOTE(VALUE v);
51static inline VALUE QUOTE_ID(ID v);
52static inline bool is_ascii_string(VALUE str);
53static inline bool is_broken_string(VALUE str);
54static inline VALUE rb_str_eql_internal(const VALUE str1, const VALUE str2);
55
56RUBY_SYMBOL_EXPORT_BEGIN
57/* string.c (export) */
60VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb_encoding *enc);
61VALUE rb_str_upto_each(VALUE, VALUE, int, int (*each)(VALUE, VALUE), VALUE);
63RUBY_SYMBOL_EXPORT_END
64
66VALUE rb_fstring_new(const char *ptr, long len);
69VALUE rb_str_concat_literals(size_t num, const VALUE *strary);
70VALUE rb_str_eql(VALUE str1, VALUE str2);
72VALUE rb_sym_proc_call(ID mid, int argc, const VALUE *argv, int kw_splat, VALUE passed_proc);
73
77
78#define rb_fstring_lit(str) rb_fstring_new((str), rb_strlen_lit(str))
79#define rb_fstring_literal(str) rb_fstring_lit(str)
80#define rb_fstring_enc_lit(str, enc) rb_fstring_enc_new((str), rb_strlen_lit(str), (enc))
81#define rb_fstring_enc_literal(str, enc) rb_fstring_enc_lit(str, enc)
82
83static inline VALUE
84QUOTE(VALUE v)
85{
87}
88
89static inline VALUE
90QUOTE_ID(ID i)
91{
93}
94
95static inline bool
96STR_EMBED_P(VALUE str)
97{
98 return ! FL_TEST_RAW(str, STR_NOEMBED);
99}
100
101static inline bool
102STR_SHARED_P(VALUE str)
103{
105}
106
107static inline bool
108is_ascii_string(VALUE str)
109{
111}
112
113static inline bool
114is_broken_string(VALUE str)
115{
117}
118
119/* expect tail call optimization */
120static inline VALUE
121rb_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 */
Internal header absorbing C compipler differences.
struct RIMemo * ptr
Definition: debug.c:88
#define MJIT_SYMBOL_EXPORT_END
Definition: dllexport.h:63
#define MJIT_SYMBOL_EXPORT_BEGIN
Definition: dllexport.h:62
big_t * num
Definition: enough.c:232
uint8_t len
Definition: escape.c:17
char str[HTML_ESCAPE_MAX_LEN+1]
Definition: escape.c:18
#define RSTRING_LEN(string)
Definition: fbuffer.h:22
#define RSTRING_PTR(string)
Definition: fbuffer.h:19
#define ELTS_SHARED
Definition: fl_type.h:84
#define FL_TEST_RAW
Definition: fl_type.h:131
#define FL_ALL_RAW
Definition: fl_type.h:123
#define ENC_CODERANGE_7BIT
Definition: encoding.h:93
int rb_enc_str_coderange(VALUE)
Definition: string.c:725
#define ENC_CODERANGE_BROKEN
Definition: encoding.h:95
Thin wrapper to ruby/config.h.
int rb_str_comparable(VALUE, VALUE)
Definition: string.c:3353
VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb_encoding *enc)
Definition: string.c:435
VALUE rb_str_initialize(VALUE str, const char *ptr, long len, rb_encoding *enc)
Definition: string.c:1034
VALUE rb_str_locktmp_ensure(VALUE str, VALUE(*func)(VALUE), VALUE arg)
Definition: string.c:2835
char * rb_str_fill_terminator(VALUE str, const int termlen)
Definition: string.c:2454
const char * ruby_escaped_char(int c)
Definition: string.c:6117
void rb_str_change_terminator_length(VALUE str, const int oldtermlen, const int termlen)
Definition: string.c:2378
VALUE rb_str_eql(VALUE str1, VALUE str2)
Definition: string.c:3451
int rb_str_symname_p(VALUE)
Definition: string.c:11027
VALUE rb_str_quote_unprintable(VALUE)
Definition: string.c:11046
VALUE rb_sym_proc_call(ID mid, int argc, const VALUE *argv, int kw_splat, VALUE passed_proc)
Definition: string.c:11171
size_t rb_str_memsize(VALUE)
Definition: string.c:1460
VALUE rb_str_opt_plus(VALUE x, VALUE y)
Definition: string.c:2075
VALUE rb_str_cat_conv_enc_opts(VALUE newstr, long ofs, const char *ptr, long len, rb_encoding *from, int ecflags, VALUE ecopts)
Definition: string.c:1013
VALUE rb_fstring_enc_new(const char *ptr, long len, rb_encoding *enc)
Definition: string.c:453
VALUE rb_external_str_with_enc(VALUE str, rb_encoding *eenc)
Definition: string.c:1144
VALUE rb_fstring(VALUE)
Definition: string.c:353
VALUE rb_str_tmp_frozen_acquire(VALUE str)
Definition: string.c:1287
int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p)
Definition: string.c:6084
VALUE rb_str_concat_literals(size_t num, const VALUE *strary)
Definition: string.c:3127
VALUE rb_str_upto_each(VALUE, VALUE, int, int(*each)(VALUE, VALUE), VALUE)
Definition: string.c:4483
void rb_str_make_independent(VALUE str)
Definition: string.c:220
void rb_str_tmp_frozen_release(VALUE str, VALUE tmp)
Definition: string.c:1294
VALUE rb_str_upto_endless_each(VALUE, int(*each)(VALUE, VALUE), VALUE)
Definition: string.c:4565
VALUE rb_obj_as_string_result(VALUE str, VALUE obj)
Definition: string.c:1541
VALUE rb_str_chomp_string(VALUE str, VALUE chomp)
Definition: string.c:9236
VALUE rb_fstring_new(const char *ptr, long len)
Definition: string.c:446
#define STR_NOEMBED
Definition: string.h:19
char * rb_str_to_cstr(VALUE str)
Definition: string.c:2432
VALUE rb_id_quote_unprintable(ID)
Definition: string.c:11067
#define rb_fstring_cstr(str)
Definition: string.h:136
int rb_enc_str_coderange_scan(VALUE str, rb_encoding *enc)
Definition: string.c:719
VALUE rb_ec_str_resurrect(struct rb_execution_context_struct *ec, VALUE str)
Definition: string.c:1644
VALUE rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl)
Definition: string.c:10587
int memcmp(const void *s1, const void *s2, size_t len)
Definition: memcmp.c:7
const char * name
Definition: nkf.c:208
int argc
Definition: ruby.c:240
char ** argv
Definition: ruby.c:241
#define Qtrue
#define Qfalse
C99 shim for <stdbool.h>
unsigned long VALUE
Definition: value.h:38
unsigned long ID
Definition: value.h:39