Linux premium180.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
LiteSpeed
: 162.0.209.168 | : 216.73.216.187
Cant Read [ /etc/named.conf ]
8.3.30
nortrmdp
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
opt /
alt /
ruby33 /
include /
ruby /
internal /
intern /
[ HOME SHELL ]
Name
Size
Permission
Action
select
[ DIR ]
drwxr-xr-x
array.h
25.15
KB
-rw-r--r--
bignum.h
30.04
KB
-rw-r--r--
class.h
15.67
KB
-rw-r--r--
compar.h
2.51
KB
-rw-r--r--
complex.h
8.21
KB
-rw-r--r--
cont.h
11.43
KB
-rw-r--r--
dir.h
1.9
KB
-rw-r--r--
enum.h
2.82
KB
-rw-r--r--
enumerator.h
12.13
KB
-rw-r--r--
error.h
9.59
KB
-rw-r--r--
eval.h
8.49
KB
-rw-r--r--
file.h
9.37
KB
-rw-r--r--
hash.h
11.62
KB
-rw-r--r--
io.h
26.24
KB
-rw-r--r--
load.h
10.42
KB
-rw-r--r--
marshal.h
5.45
KB
-rw-r--r--
numeric.h
7.49
KB
-rw-r--r--
object.h
19.13
KB
-rw-r--r--
parse.h
6.18
KB
-rw-r--r--
proc.h
13.54
KB
-rw-r--r--
process.h
11.3
KB
-rw-r--r--
random.h
4.3
KB
-rw-r--r--
range.h
3.98
KB
-rw-r--r--
rational.h
6.34
KB
-rw-r--r--
re.h
8.52
KB
-rw-r--r--
ruby.h
2.78
KB
-rw-r--r--
select.h
3.85
KB
-rw-r--r--
signal.h
6.39
KB
-rw-r--r--
sprintf.h
6.32
KB
-rw-r--r--
string.h
67.37
KB
-rw-r--r--
struct.h
8.74
KB
-rw-r--r--
thread.h
18.03
KB
-rw-r--r--
time.h
6.33
KB
-rw-r--r--
variable.h
20.81
KB
-rw-r--r--
vm.h
16.48
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : string.h
#ifndef RBIMPL_INTERN_STRING_H /*-*-C++-*-vi:se ft=cpp:*/ #define RBIMPL_INTERN_STRING_H /** * @file * @author Ruby developers <ruby-core@ruby-lang.org> * @copyright This file is a part of the programming language Ruby. * Permission is hereby granted, to either redistribute and/or * modify this file, provided that the conditions mentioned in the * file COPYING are met. Consult the file for details. * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are * implementation details. Don't take them as canon. They could * rapidly appear then vanish. The name (path) of this header file * is also an implementation detail. Do not expect it to persist * at the place it is now. Developers are free to move it anywhere * anytime at will. * @note To ruby-core: remember that this header can be possibly * recursively included from extension libraries written in C++. * Do not expect for instance `__VA_ARGS__` is always available. * We assume C99 for ruby itself but we don't assume languages of * extension libraries. They could be written in C++98. * @brief Public APIs related to ::rb_cString. */ #include "ruby/internal/config.h" #ifdef STDC_HEADERS # include <stddef.h> #endif #ifdef HAVE_STRING_H # include <string.h> #endif #ifdef HAVE_STDINT_H # include <stdint.h> #endif #include "ruby/internal/attr/deprecated.h" #include "ruby/internal/attr/nonnull.h" #include "ruby/internal/attr/pure.h" #include "ruby/internal/constant_p.h" #include "ruby/internal/dllexport.h" #include "ruby/internal/value.h" #include "ruby/internal/variable.h" /* rb_gvar_setter_t */ #include "ruby/st.h" /* st_index_t */ RBIMPL_SYMBOL_EXPORT_BEGIN() /* string.c */ /** * Allocates an instance of ::rb_cString. * * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString, of `len` bytes length, of * "binary" encoding, whose contents are verbatim copy of `ptr`. * @pre At least `len` bytes of continuous memory region shall be * accessible via `ptr`. */ VALUE rb_str_new(const char *ptr, long len); /** * Identical to rb_str_new(), except it assumes the passed pointer is a pointer * to a C string. * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @exception rb_eArgError `ptr` is a null pointer. * @return An instance of ::rb_cString, of "binary" encoding, whose * contents are verbatim copy of `ptr`. * @pre `ptr` must not be a null pointer. */ VALUE rb_str_new_cstr(const char *ptr); /** * Identical to rb_str_new_cstr(), except it takes a Ruby's string instead of * C's. Implementation wise it creates a string that shares the backend memory * region with the receiver. So the name. But there is no way for extension * libraries to know if a string is of such variant. * * @param[in] str An object of ::RString. * @return An allocated instance of ::rb_cString, which shares the * encoding, length, and contents with the passed string. * @pre `str` must not be any arbitrary object except ::RString. * @note Use #StringValue to enforce the precondition. */ VALUE rb_str_new_shared(VALUE str); /** * Creates a frozen copy of the string, if necessary. This function does * nothing when the passed string is already frozen. Otherwise, it allocates a * copy of it, which is frozen. The passed string is untouched either ways. * * @param[in] str An object of ::RString. * @return Something frozen. * @pre `str` must not be any arbitrary object except ::RString. * @note Use #StringValue to enforce the precondition. */ VALUE rb_str_new_frozen(VALUE str); /** * Identical to rb_str_new(), except it takes the class of the allocating * object. * * @param[in] obj A string-ish object. * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of the class of `obj`, of `len` bytes length, of * "binary" encoding, whose contents are verbatim copy of `ptr`. * @pre At least `len` bytes of continuous memory region shall be * accessible via `ptr`. * * @internal * * Why it doesn't take an instance of ::rb_cClass? */ VALUE rb_str_new_with_class(VALUE obj, const char *ptr, long len); /** * Identical to rb_str_new(), except it generates a string of "default * external" encoding. * * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "default external" is fully defined over * the given contents, then the return value is a string of * "default external" encoding, whose contents are the converted * ones. Otherwise the string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. */ VALUE rb_external_str_new(const char *ptr, long len); RBIMPL_ATTR_NONNULL(()) /** * Identical to rb_external_str_new(), except it assumes the passed pointer is * a pointer to a C string. It can also be seen as a routine identical to * rb_str_new_cstr(), except it generates a string of "default external" * encoding. * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "default external" is fully defined over * the given contents, then the return value is a string of * "default external" encoding, whose contents are the converted * ones. Otherwise the string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. * @pre `ptr` must not be a null pointer. */ VALUE rb_external_str_new_cstr(const char *ptr); /** * Identical to rb_str_new(), except it generates a string of "locale" * encoding. It can also be seen as a routine identical to * rb_external_str_new(), except it generates a string of "locale" encoding * instead of "default external" encoding. * * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "locale" is fully defined over the given * contents, then the return value is a string of "locale" * encoding, whose contents are the converted ones. Otherwise the * string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. */ VALUE rb_locale_str_new(const char *ptr, long len); RBIMPL_ATTR_NONNULL(()) /** * Identical to rb_locale_str_new(), except it assumes the passed pointer is a * pointer to a C string. It can also be seen as a routine identical to * rb_external_str_new_cstr(), except it generates a string of "locale" * encoding instead of "default external". * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "locale" is fully defined over the given * contents, then the return value is a string of "locale" * encoding, whose contents are the converted ones. Otherwise the * string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. * @pre `ptr` must not be a null pointer. */ VALUE rb_locale_str_new_cstr(const char *ptr); /** * Identical to rb_str_new(), except it generates a string of "filesystem" * encoding. It can also be seen as a routine identical to * rb_external_str_new(), except it generates a string of "filesystem" encoding * instead of "default external" encoding. * * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "filesystem" is fully defined over the * given contents, then the return value is a string of * "filesystem" encoding, whose contents are the converted ones. * Otherwise the string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. */ VALUE rb_filesystem_str_new(const char *ptr, long len); RBIMPL_ATTR_NONNULL(()) /** * Identical to rb_filesystem_str_new(), except it assumes the passed pointer * is a pointer to a C string. It can also be seen as a routine identical to * rb_external_str_new_cstr(), except it generates a string of "filesystem" * encoding instead of "default external". * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "filesystem" is fully defined over the * given contents, then the return value is a string of * "filesystem" encoding, whose contents are the converted ones. * Otherwise the string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. * @pre `ptr` must not be a null pointer. */ VALUE rb_filesystem_str_new_cstr(const char *ptr); /** * Allocates a "string buffer". A string buffer here is an instance of * ::rb_cString, whose capacity is bigger than the length of it. If you can * say that a string grows to a specific amount of bytes, this could be * effective than resizing a string over and over again and again. * * @param[in] capa Designed capacity of the generating string. * @return An empty string, of "binary" encoding, whose capacity is `capa`. */ VALUE rb_str_buf_new(long capa); RBIMPL_ATTR_NONNULL(()) /** * This is a rb_str_buf_new() + rb_str_buf_cat() combo. * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString, of "binary" encoding, whose * contents are verbatim copy of `ptr`. * @pre `ptr` must not be a null pointer. * * @internal * * This must be identical to rb_str_new_cstr(), except done in inefficient way? * @shyouhei doesn't understand why this is not a simple alias. */ VALUE rb_str_buf_new_cstr(const char *ptr); /** * Allocates a "temporary" string. This is a hidden empty string. Handy on * occasions. * * @param[in] len Designed length of the string. * @return A hidden, empty string. * @see rb_obj_hide() */ VALUE rb_str_tmp_new(long len); /** * Identical to rb_str_new(), except it generates a string of "US ASCII" * encoding. This is different from rb_external_str_new(), not only for the * output encoding, but also it doesn't convert the contents. * * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString, of `len` bytes length, of * "US ASCII" encoding, whose contents are verbatim copy of `ptr`. */ VALUE rb_usascii_str_new(const char *ptr, long len); /** * Identical to rb_str_new_cstr(), except it generates a string of "US ASCII" * encoding. It can also be seen as a routine Identical to * rb_usascii_str_new(), except it assumes the passed pointer is a pointer to a * C string. * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @exception rb_eArgError `ptr` is a null pointer. * @return An instance of ::rb_cString, of "US ASCII" encoding, whose * contents are verbatim copy of `ptr`. * @pre `ptr` must not be a null pointer. */ VALUE rb_usascii_str_new_cstr(const char *ptr); /** * Identical to rb_str_new(), except it generates a string of "UTF-8" encoding. * * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString, of `len` bytes length, of * "UTF-8" encoding, whose contents are verbatim copy of `ptr`. */ VALUE rb_utf8_str_new(const char *ptr, long len); /** * Identical to rb_str_new_cstr(), except it generates a string of "UTF-8" * encoding. It can also be seen as a routine Identical to * rb_usascii_str_new(), except it assumes the passed pointer is a pointer to a * C string. * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @exception rb_eArgError `ptr` is a null pointer. * @return An instance of ::rb_cString, of "UTF-8" encoding, whose contents * are verbatim copy of `ptr`. * @pre `ptr` must not be a null pointer. */ VALUE rb_utf8_str_new_cstr(const char *ptr); /** * @name Special strings that are backended by C string literals. * * *_str_new_static functions are intended for C string literals. * They require memory in the range [ptr, ptr+len] to always be readable. * Note that this range covers a total of len + 1 bytes. * * @{ */ /** * Identical to rb_str_new(), except it takes a C string literal. * * @param[in] ptr A C string literal. * @param[in] len `strlen(ptr)`. * @exception rb_eArgError `len` out of range of `size_t`. * @pre `ptr` must be a C string constant. * @return An instance of ::rb_cString, of "binary" encoding, whose backend * storage is the passed C string literal. * @warning It is a very bad idea to write to a C string literal (often * immediate SEGV shall occur). Consider return values of this * function be read-only. * * @internal * * Surprisingly it can take NULL, and generates an empty string. */ VALUE rb_str_new_static(const char *ptr, long len); /** * Identical to rb_str_new_static(), except it generates a string of "US ASCII" * encoding instead of "binary". It can also be seen as a routine identical to * rb_usascii_str_new(), except it takes a C string literal. * * @param[in] ptr A C string literal. * @param[in] len `strlen(ptr)`. * @exception rb_eArgError `len` out of range of `size_t`. * @pre `ptr` must be a C string constant. * @return An instance of ::rb_cString, of "US ASCII" encoding, whose * backend storage is the passed C string literal. * @warning It is a very bad idea to write to a C string literal (often * immediate SEGV shall occur). Consider return values of this * function be read-only. */ VALUE rb_usascii_str_new_static(const char *ptr, long len); /** * Identical to rb_str_new_static(), except it generates a string of "UTF-8" * encoding instead of "binary". It can also be seen as a routine identical to * rb_utf8_str_new(), except it takes a C string literal. * * @param[in] ptr A C string literal. * @param[in] len `strlen(ptr)`. * @exception rb_eArgError `len` out of range of `size_t`. * @pre `ptr` must be a C string constant. * @return An instance of ::rb_cString, of "UTF-8" encoding, whose backend * storage is the passed C string literal. * @warning It is a very bad idea to write to a C string literal (often * immediate SEGV shall occur). Consider return values of this * function be read-only. */ VALUE rb_utf8_str_new_static(const char *ptr, long len); /** @} */ /** * Identical to rb_interned_str(), except it takes a Ruby's string instead of * C's. It can also be seen as a routine identical to to rb_str_new_shared(), * except it returns an infamous "f"string. * * @param[in] str An object of ::RString. * @return An instance of ::rb_cString, either cached or allocated, which * has the identical encoding, length, and contents with the passed * string. * @pre `str` must not be any arbitrary object except ::RString. * @note Use #StringValue to enforce the precondition. * * @internal * * It actually finds or creates a fstring of the needed property, and * destructively modifies the receiver behind-the-scene so that it becomes a * shared string whose parent is the returning fstring. */ VALUE rb_str_to_interned_str(VALUE str); /** * Identical to rb_str_new(), except it returns an infamous "f"string. What is * a fstring? Well it is a special subkind of strings that is immutable, * deduped globally, and managed by our GC. It is much like a Symbol (in fact * Symbols are dynamic these days and are backended using fstrings). This * concept has been silently introduced at some point in 2.x era. Since then * it gained wider acceptance in the core. Starting from 3.x extension * libraries can also generate ones. * * @param[in] ptr A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eArgError `len` is negative. * @return A found or created instance of ::rb_cString, of `len` bytes * length, of "binary" encoding, whose contents are identical to * that of `ptr`. * @pre At least `len` bytes of continuous memory region shall be * accessible via `ptr`. */ VALUE rb_interned_str(const char *ptr, long len); RBIMPL_ATTR_NONNULL(()) /** * Identical to rb_interned_str(), except it assumes the passed pointer is a * pointer to a C's string. It can also be seen as a routine identical to to * rb_str_to_interned_str(), except it takes a C's string instead of Ruby's. * Or it can also be seen as a routine identical to rb_str_new_cstr(), except * it returns an infamous "f"string. * * @param[in] ptr A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString, of "binary" encoding, whose * contents are verbatim copy of `ptr`. * @pre `ptr` must not be a null pointer. */ VALUE rb_interned_str_cstr(const char *ptr); /** * Destroys the given string for no reason. * * @warning DO NOT USE IT. * @warning Leave this task to our GC. * @warning It was a bad idea at the first place to let you know about it. * * @param[out] str The string to be executed. * @post The given string no longer exists. * @note Maybe `String#clear` could be what you want. * * @internal * * Should have moved this to `internal/string.h`. */ void rb_str_free(VALUE str); /** * Replaces the contents of the former with the latter. * * @param[out] dst Destination object. * @param[in] src Source object. * @pre Both objects must not be any arbitrary objects except * ::RString. * @post `dst`'s former components are abandoned. It now has the * identical encoding, length, and contents to `src`. * @see rb_str_replace() * * @internal * * @shyouhei doesn't understand why this is useful to extension libraries. * Just use rb_str_replace(). What's wrong with that? */ void rb_str_shared_replace(VALUE dst, VALUE src); /** * Identical to rb_str_cat_cstr(), except it takes Ruby's string instead of * C's. It can also be seen as a routine identical to rb_str_shared_replace(), * except it appends instead of replaces. * * @param[out] dst Destination object. * @param[in] src Source object. * @exception rb_eEncCompatError Can't mix the encodings. * @exception rb_eArgError Result string too big. * @return The passed `dst`. * @pre Both objects must not be any arbitrary objects except * ::RString. * @post `dst` has the contents of `src` appended, with encoding * converted into `dst`'s one, into the end of `dst`. */ VALUE rb_str_buf_append(VALUE dst, VALUE src); /** @alias{rb_str_cat} */ VALUE rb_str_buf_cat(VALUE, const char*, long); /** @alias{rb_str_cat_cstr} */ VALUE rb_str_buf_cat2(VALUE, const char*); RBIMPL_ATTR_NONNULL(()) /** * Identical to rb_str_cat_cstr(), except it additionally assumes the source * string be a NUL terminated ASCII string. * * @param[out] dst Destination object. * @param[in] src Source string. * @exception rb_eArgError Result string too big. * @return The passed `dst`. * @pre `dst` must not be any arbitrary object except ::RString. * @pre `src` must be a NUL terminated ASCII string. * @post `dst` has the contents of `src` appended, with encoding * converted into `dst`'s one, into the end of `dst`. */ VALUE rb_str_buf_cat_ascii(VALUE dst, const char *src); /** * Try converting an object to its stringised representation using its `to_s` * method, if any. If there is no such thing, it resorts to rb_any_to_s() * output. * * @param[in] obj Arbitrary ruby object to stringise. * @return An instance of ::rb_cString. */ VALUE rb_obj_as_string(VALUE obj); /** * Try converting an object to its stringised representation using its `to_str` * method, if any. If there is no such thing, returns ::RUBY_Qnil. * * @param[in] obj Arbitrary ruby object to stringise. * @exception rb_eTypeError `obj.to_str` returned something non-String. * @retval RUBY_Qnil No conversion from obj to String defined. * @return otherwise Stringised representation of `obj`. * @see rb_io_check_io * @see rb_check_array_type * @see rb_check_hash_type */ VALUE rb_check_string_type(VALUE obj); /** * Asserts that the given string's encoding is (Ruby's definition of) ASCII * compatible. * * @param[in] obj An instance of ::rb_cString. * @exception rb_eEncCompatError `obj` is ASCII incompatible. * * @internal * * @shyouhei doesn't know if this is an Easter egg or an official feature, but * this function can in fact take non-strings such as Symbols, Regexps, IOs, * etc. However if something unsupported is passed, it causes SEGV. It seems * the feature is kind of untested. */ void rb_must_asciicompat(VALUE obj); /** * Duplicates a string. * * @param[in] str String in question to duplicate. * @return A duplicated new instance. * @pre `str` must be of ::RString. */ VALUE rb_str_dup(VALUE str); /** * I guess there is no use case of this function in extension libraries, but * this is a routine identical to rb_str_dup(), except it always creates an * instance of ::rb_cString regardless of the given object's class. This makes * the most sense when the passed string is formerly hidden by rb_obj_hide(). * * @param[in] str A string, possibly hidden. * @return A duplicated new instance of ::rb_cString. */ VALUE rb_str_resurrect(VALUE str); /** * Obtains a "temporary lock" of the string. This advisory locking mechanism * prevents other cooperating threads from tampering the receiver. The same * thing could be done via freeze mechanism, but this one can also be unlocked * using rb_str_unlocktmp(). * * @param[out] str String to lock. * @exception rb_eRuntimeError `str` already locked. * @return The given string. * @post The string is locked. */ VALUE rb_str_locktmp(VALUE str); /** * Releases a lock formerly obtained by rb_str_locktmp(). * * @param[out] str String to unlock. * @exception rb_eRuntimeError `str` already unlocked. * @return The given string. * @post The string is locked. */ VALUE rb_str_unlocktmp(VALUE str); /** @alias{rb_str_new_frozen} */ VALUE rb_str_dup_frozen(VALUE); /** @alias{rb_str_new_frozen} */ #define rb_str_dup_frozen rb_str_new_frozen /** * Generates a new string, concatenating the former to the latter. It can also * be seen as a routine identical to rb_str_append(), except it doesn't tamper * the passed strings to create a new one instead. * * @param[in] lhs Source string #1. * @param[in] rhs Source string #2. * @exception rb_eEncCompatError Can't mix the encodings. * @exception rb_eArgError Result string too big. * @return A new string containing `rhs` concatenated to `lhs`. * @pre Both objects must not be any arbitrary objects except ::RString. * @note This operation doesn't commute. Don't get confused by the * "plus" terminology. For historical reasons there are some * noncommutative `+`s in Ruby. This is one of such things. There * has been a long discussion around `+`s in programming languages. */ VALUE rb_str_plus(VALUE lhs, VALUE rhs); /** * Repetition of a string. * * @param[in] str String to repeat. * @param[in] num Count, something numeric. * @exception rb_eArgError `num` is negative. * @return A new string repeating `num` times of `str`. */ VALUE rb_str_times(VALUE str, VALUE num); /** * Byte offset to character offset conversion. This makes sense when the * receiver is in a multibyte encoding. The string's i-th character does not * always sit at its i-th byte. This function scans the contents to find the * character index that matches the byte index. Generally speaking this is an * `O(n)` operation. Could be slow. * * @param[in] str The string to scan. * @param[in] pos Offset, in bytes. * @return Offset, in characters. */ long rb_str_sublen(VALUE str, long pos); /** * This is the implementation of two-argumented `String#slice`. * * - Returns the substring of the given `len` found in `str` at offset `beg`: * * ```ruby * 'foo'[0, 2] # => "fo" * 'foo'[0, 0] # => "" * ``` * * - Counts backward from the end of `str` if `beg` is negative: * * ```ruby * 'foo'[-2, 2] # => "oo" * ``` * * - Special case: returns a new empty string if `beg` is equal to the length * of `str`: * * ```ruby * 'foo'[3, 2] # => "" * ``` * * - Returns a null pointer if `beg` is out of range: * * ```ruby * 'foo'[4, 2] # => nil * 'foo'[-4, 2] # => nil * ``` * * - Returns the trailing substring of `str` if `len` is large: * * ```ruby * 'foo'[1, 50] # => "oo" * ``` * * - Returns a null pointer if `len` is negative: * * ```ruby * 'foo'[0, -1] # => nil * ``` * * @param[in] str The string to slice. * @param[in] beg Requested offset of the substring. * @param[in] len Requested length of the substring. * @retval RUBY_Qnil Parameters out of range. * @retval otherwise A new string whose contents is the specified * substring of `str`. * @pre `str` must not be any arbitrary objects except ::RString. */ VALUE rb_str_substr(VALUE str, long beg, long len); /** * Identical to rb_str_substr(), except the numbers are interpreted as byte * offsets instead of character offsets. * * @param[in] str The string to slice. * @param[in] beg Requested offset of the substring. * @param[in] len Requested length of the substring. * @return A new string whose contents is the specified substring of `str`. * @pre `str` must not be any arbitrary objects except ::RString. * @pre `beg` and `len` must not point to OOB contents. */ VALUE rb_str_subseq(VALUE str, long beg, long len); /** * Identical to rb_str_substr(), except it returns a C's string instead of * Ruby's. * * @param[in] str The string to slice. * @param[in] beg Requested offset of the substring. * @param[in,out] len Requested length of the substring. * @retval NULL Parameters out of range. * @retval otherwise A pointer inside of `str`'s backend storage where * the specified substring exist. * @pre `str` must not be any arbitrary objects except ::RString. * @post `len` is updated to have the length of the return value. */ char *rb_str_subpos(VALUE str, long beg, long *len); /** * Declares that the string is about to be modified. This for instance let the * string have a dedicated backend storage. * * @param[out] str String about to be modified. * @exception rb_eRuntimeError `str` is `locktmp`-ed. * @exception rb_eFrozenError `str` is frozen. * @pre `str` must not be any arbitrary objects except ::RString. * @post Upon successful return the passed string is eligible to be * modified. */ void rb_str_modify(VALUE str); /** * Identical to rb_str_modify(), except it additionally expands the capacity of * the receiver. * * @param[out] str Target string to modify. * @param[in] capa Additional capacity to add. * @exception rb_eArgError `capa` is negative. * @exception rb_eRuntimeError `str` is `locktmp`-ed. * @exception rb_eFrozenError `str` is frozen. * @pre `str` must not be any arbitrary objects except ::RString. * @post Upon successful return the passed string is modified so that * its capacity is increased for `capa` bytes. */ void rb_str_modify_expand(VALUE str, long capa); /** * This is the implementation of `String#freeze`. * * @param[out] str Target string to freeze. * @return The passed string. * @post Upon successful return the passed string is frozen. */ VALUE rb_str_freeze(VALUE str); /** * Overwrites the length of the string. Typically this is used to shrink a * string that was formerly expanded. * * ```CXX * extern int fd; * auto str = rb_eval_string("'...'"); * rb_str_modify_expand(str, BUFSIZ); * if (auto len = recv(fd, RSTRING_PTR(str), BUFSIZ, 0); len >= 0) { * rb_str_set_len(str, len); * } * else { * rb_sys_fail("recv(2)"); * } * ``` * * @param[out] str String to shrink. * @param[in] len New length of the string. * @exception rb_eRuntimeError `str` is `locktmp`-ed. * @exception rb_eFrozenError `str` is frozen. * @pre `str` must not be any arbitrary objects except ::RString. * @post Upon successful return `str`'s length is set to `len`. */ void rb_str_set_len(VALUE str, long len); /** * Overwrites the length of the string. In contrast to rb_str_set_len(), this * function can also expand a string. * * @param[out] str String to shrink. * @param[in] len New length of the string. * @exception rb_eArgError `len` is negative. * @exception rb_eRuntimeError `str` is `locktmp`-ed. * @exception rb_eFrozenError `str` is frozen. * @return The passed `str`. * @pre `str` must not be any arbitrary objects except ::RString. * @post Upon successful return `str` is either expanded or shrunken to * have its length be `len`. */ VALUE rb_str_resize(VALUE str, long len); /** * Destructively appends the passed contents to the string. * * @param[out] dst Destination object. * @param[in] src Contents to append. * @param[in] srclen Length of `src`. * @exception rb_eArgError `srclen` is negative. * @return The passed `dst`. * @pre `dst` must not be any arbitrary objects except ::RString. * @post `dst` has the contents of `ptr` appended. */ VALUE rb_str_cat(VALUE dst, const char *src, long srclen); /** * Identical to rb_str_cat(), except it assumes the passed pointer is a pointer * to a C string. * * @param[out] dst Destination object. * @param[in] src Contents to append. * @exception rb_eArgError Result string too big. * @exception rb_eArgError `src` is a null pointer. * @return The passed `dst`. * @pre `dst` must not be any arbitrary objects except ::RString. * @pre `src` must not be a null pointer. * @post `dst` has the contents of `src` appended. */ VALUE rb_str_cat_cstr(VALUE dst, const char *src); /** @alias{rb_str_cat_cstr} */ VALUE rb_str_cat2(VALUE, const char*); /** * Identical to rb_str_buf_append(), except it converts the right hand side * before concatenating. * * @param[out] dst Destination object. * @param[in] src Source object. * @exception rb_eEncCompatError Can't mix the encodings. * @exception rb_eArgError Result string too big. * @return The passed `dst`. * @pre `dst` must not be any arbitrary objects except ::RString. * @post `dst` has the contents of `src` appended, with encoding * converted into `dst`'s one, into the end of `dst`. */ VALUE rb_str_append(VALUE dst, VALUE src); /** * Identical to rb_str_append(), except it also accepts an integer as a * codepoint. This resembles `String#<<`. * * @param[out] dst Destination object. * @param[in] src Source object, String or Numeric. * @exception rb_eRangeError Source numeric is out of range. * @exception rb_eEncCompatError Source string too long. * @exception rb_eArgError Result string too big. * @return The passed `dst`. * @pre `dst` must not be any arbitrary objects except ::RString. * @post `dst` has the contents of `src` appended, with encoding * converted into `dst`'s one, into the end of `dst`. */ VALUE rb_str_concat(VALUE dst, VALUE src); /* random.c */ /** * This is a universal hash function. * * @warning This function changes its value per process. * @param[in] ptr Target message. * @param[in] len Length of `ptr` in bytes. * @return A pseudorandom number suitable for Hash's hash value. * @see Aumasson, JP., Bernstein, D.J., "SipHash: A Fast Short-Input * PRF", In proceedings of 13th International Conference on * Cryptology in India (INDOCRYPT 2012), LNCS 7668, pp. 489-508, * 2012. http://doi.org/10.1007/978-3-642-34931-7_28 */ st_index_t rb_memhash(const void *ptr, long len); /** * Starts a series of hashing. Suppose you have a struct: * * ```CXX * struct foo_tag { * unsigned char bar; * uint32_t baz; * }; * ``` * * It is not a wise idea to call rb_memhash() over it, because there could be * padding bits. Instead you should explicitly iterate over each fields: * * ```CXX * foo_tag foo = { 0, 0, }; * st_index_t hash = 0; * * hash = rb_hash_start(0); * hash = rb_hash_uint(hash, foo.bar); * hash = rb_hash_uint32(hash, foo.baz); * hash = rb_hash_end(hash); * ``` * * @param[in] i Initial value. * @return A hash value. */ st_index_t rb_hash_start(st_index_t i); /** @alias{st_hash_uint32} */ #define rb_hash_uint32(h, i) st_hash_uint32((h), (i)) /** @alias{st_hash_uint} */ #define rb_hash_uint(h, i) st_hash_uint((h), (i)) /** @alias{st_hash_end} */ #define rb_hash_end(h) st_hash_end(h) /* string.c */ /** * Calculates a hash value of a string. This is one of the two functions that * constructs struct ::st_hash_type. * * @param[in] str An object of ::RString. * @return A hash value. * @pre `str` must not be any arbitrary object except ::RString. * * @internal * * Although safe to call, there must be no particular use case of this function * for extension libraries. Only ruby internals must know about it. * * This is not a simple alias of rb_memhash(), because it considers the passed * string's encoding as well as its contents. */ st_index_t rb_str_hash(VALUE str); /** * Compares two strings. This is one of the two functions that constructs * struct ::st_hash_type. * * @param[in] str1 A string. * @param[in] str2 Another string. * @retval 1 They have identical contents, length, and encodings. * @retval 0 Otherwise. * @pre Both objects must not be any arbitrary objects except * ::RString. * * @internal * * In contrast to rb_str_hash(), this could be handy for comparison that only * concerns equality. rb_str_cmp() returns 1, 0, -1. */ int rb_str_hash_cmp(VALUE str1, VALUE str2); /** * Checks if two strings are comparable each other or not. Because * rb_str_cmp() must return "lesser than" or "greater than" information, * comparing two strings needs a stricter restriction. Both sides must be in a * same set of strings which have total order. This is to check that property. * Intuitive it sounds? But they can have different encodings. A character * and another might or might not appear in the same order in their codepoints. * It is complicated than you think. * * @param[in] str1 A string. * @param[in] str2 Another string. * @retval 1 They agree on a total order. * @retval 0 Otherwise. * @pre Both objects must not be any arbitrary objects except * ::RString. */ int rb_str_comparable(VALUE str1, VALUE str2); /** * Compares two strings, as in `strcmp(3)`. This does not consider the current * locale, but considers the encodings of both sides instead. * * @param[in] lhs A string. * @param[in] rhs Another string. * @retval -1 `lhs` is "bigger than" `rhs`. * @retval 1 `rhs` is "bigger than" `lhs`. * @retval 0 Otherwise, e.g. not comparable. * @pre Both objects must not be any arbitrary objects except * ::RString. */ int rb_str_cmp(VALUE lhs, VALUE rhs); /** * Equality of two strings. * * If `str2` is not a String, it resorts to `str2 == str1`. Otherwise if they * are not comparable, returns ::RUBY_Qfalse. Otherwise if they have the same * contents and the length, returns ::RUBY_Qtrue. Otherwise, returns * ::RUBY_Qfalse. * * @param[in] str1 A string. * @param[in] str2 Another string. * @retval RUBY_Qtrue They are equal. * @retval RUBY_Qfalse They are either different, or not comparable. */ VALUE rb_str_equal(VALUE str1, VALUE str2); /** * Shrinks the given string for the given number of bytes. * * @param[out] str String to squash. * @param[in] len Number of bytes to reduce. * @exception rb_eRuntimeError `str` is `locktmp`-ed. * @exception rb_eFrozenError `str` is frozen. * @return The passed `str`. * @pre `str` must not be any arbitrary objects except ::RString. * @post `str` is shrunken. * @warning Can break a multibyte character in middle. * * @internal * * What if `len` is negative? */ VALUE rb_str_drop_bytes(VALUE str, long len); /** * Replaces some (or all) of the contents of the given string. This is the * implementation of three-argumented `String#[]=`. * * @param[out] dst Target string to update. * @param[in] beg Offset of the affected portion. * @param[in] len Length of the affected portion. * @param[in] src Object to be assigned. * @exception rb_eTypeError `src` has no implicit conversion to String. * @exception rb_eIndexError `len` is negative, or `beg` is OOB. * @exception rb_eRuntimeError `dst` is `locktmp`-ed. * @exception rb_eFrozenError `dst` is frozen. * @note Unlike rb_str_substr(), this function raises. * @post A portion of `dst` from `beg` to `len` is the stringised * representation of `src`. If that replacement string is not the * same length as the portion it is replacing, `dst` will be * resized accordingly. */ void rb_str_update(VALUE dst, long beg, long len, VALUE src); /** * Replaces the contents of the former object with the stringised contents of * the latter. * * @param[out] dst Destination object. * @param[in] src Source object. * @exception rb_eTypeError `src` has no implicit conversion to String. * @exception rb_eRuntimeError `dst` is `locktmp`-ed. * @exception rb_eFrozenError `dst` is frozen. * @return The passed `dst`. * @pre `dst` must not be any arbitrary object except ::RString. * @post `dst`'s former components are abandoned. It now has the * identical encoding, length, and contents to `src`. */ VALUE rb_str_replace(VALUE dst, VALUE src); /** * Generates a "readable" version of the receiver. * * @warning The output is _insecure_. Never feed one to `eval`. * @warning The output is not always in the same encoding as the given one. * @warning A character might or might not be escaped, depending on the * result encoding. * @param[in] str String to inspect. * @return Its inspection, either in default internal encoding if any, or * in default external encoding otherwise. * @see rb_str_dump() * * @internal * * This is a (silent) fix of an actual vulnerability feeding `inspect` output * strings to `eval`: * https://github.com/hiki/hiki/commit/8771a6e25198e264a2bf9dc1c102fea2cc8ff975 * * ... and its advisory: * http://hikiwiki.org/en/advisory20040712.html */ VALUE rb_str_inspect(VALUE str); /** * "Inverse" of rb_eval_string(). Returns a quoted version of the string. All * non-printing characters are replaced by `\uNNNN` or `\xHH` notation and all * special characters are escaped. The result string is guaranteed to render a * string of the same contents when passed to `eval` and friends. * * @param[in] str String to dump. * @exception rb_eRuntimeError Too many escape sequences causes integer * overflow on the length of the string. * @return An US-ASCII string that includes all the necessary info to * reconstruct the original string. */ VALUE rb_str_dump(VALUE str); /** * Divides the given string based on the given delimiter. This is the * 1-argument 0-block version of `String#split`. * * @param[in] str Object in question to split. * @param[in] delim Delimiter, in C string. * @exception rb_eTypeError `str` has no implicit conversion to String. * @exception rb_eArgError `delim` is a null pointer. * @return An array of strings, which are substrings of the passed `str`. * If `delim` is an empty C string (i.e. `""`), `str` is split into * each characters. If `delim` is a C string whose sole content is * a whitespace (i.e. `" "`), `str` is split on whitespaces, with * leading and trailing whitespace and runs of contiguous * whitespace characters ignored. Otherwise, `str` is split * according to `delim`. */ VALUE rb_str_split(VALUE str, const char *delim); /** * This is a ::rb_gvar_setter_t that refutes non-string assignments. * * @exception rb_eTypeError Passed something non-string. */ rb_gvar_setter_t rb_str_setter; /* symbol.c */ /** * Identical to rb_to_symbol(), except it assumes the receiver being an * instance of ::RString. * * @param[in] str The name of the id. * @exception rb_eRuntimeError Too many symbols. * @return A (possibly new) id whose value is the given `str`. * @pre `str` must not be any arbitrary object except ::RString. * @note These days Ruby internally has two kinds of symbols * (static/dynamic). Symbols created using this function would * become dynamic ones; i.e. would be garbage collected. It could * be safer for you to use it than alternatives, when applicable. */ VALUE rb_str_intern(VALUE str); /* string.c */ /** * This is an rb_sym2str() + rb_str_dup() combo. * * @param[in] sym A symbol to query. * @return A string duplicating the symbol's backend storage. * * @internal * * This function causes SEGV when the passed value is a static symbol that * doesn't exist. */ VALUE rb_sym_to_s(VALUE sym); /** * Counts the number of characters (not bytes) that are stored inside of the * given string. This of course depends on its encoding. Also this function * generally runs in O(n), because for instance you have to scan the entire * string to know how many characters are there in a UTF-8 string. * * @param[in] str Target string to query. * @return Its number of characters. */ long rb_str_strlen(VALUE str); /** * Identical to rb_str_strlen(), except it returns the value in ::rb_cInteger. * * @param[in] str Target string to query. * @return Its number of characters. */ VALUE rb_str_length(VALUE); /** * "Inverse" of rb_str_sublen(). This function scans the contents to find the * byte index that matches the character index. Generally speaking this is an * `O(n)` operation. Could be slow. * * @param[in] str The string to scan. * @param[in] pos Offset, in characters. * @return Offset, in bytes. */ long rb_str_offset(VALUE str, long pos); RBIMPL_ATTR_PURE() /** * Queries the capacity of the given string. * * @see ::RString::capa * @param[in] str String in question. * @return Its capacity. */ size_t rb_str_capacity(VALUE str); /** * Shortens `str` and adds three dots, an ellipsis, if it is longer than `len` * characters. The length of the returned string in characters is less than or * equal to `len`. If the length of `str` is less than or equal `len`, returns * `str` itself. The encoding of returned string is equal to that of passed * one. The class of returned string is equal to that of passed one. * * @param[in] str The string to shorten. * @param[in] len The maximum string length. * @exception rb_eIndexError `len` is negative. * @retval str No need to add ellipsis. * @retval otherwise A new, shortened string. * @note The length is counted in characters. */ VALUE rb_str_ellipsize(VALUE str, long len); /** * "Cleanses" the string. A string has its encoding and its contents. They, * in practice, do not always fit. There are strings in the wild that are * "broken"; include bit patterns that are not allowed by its encoding. That * can happen when a user copy&pasted something bad, network input got * clobbered by a middleman, cosmic rays hit the physical memory, and many more * occasions. This function takes such strings, and fills the "broken" portion * with the passed replacement bit pattern. * * This function also takes a ruby block. That is a neat way to do things, but * can be annoying when the caller function want to use a block for another * purpose. * * @param[in] str Target string to scrub. * @param[in] repl Replacement string. When it is a string, * this function takes that as a replacement. * When it is ::RUBY_Qnil, this function tries * to yield a block (if any) and takes its * evaluated value as a replacement. In case * of ::RUBY_Qnil without a block, this * function takes an encoding-specific default * character (`U+FFFD`, for instance) as a last * resort. * @exception rb_eTypeError `repl` is neither string nor nil. * @exception rb_eArgError `repl` itself is broken. * @exception rb_eEncCompatError `repl` and `str` are incompatible. * @retval RUBY_Qnil `str` is already clean. * @retval otherwise A new, clean string. */ VALUE rb_str_scrub(VALUE str, VALUE repl); /** * Searches for the "successor" of a string. This function is complicated! * This is the only function in the entire ruby API (either C or Ruby) that * generates a string out of thin air. First, the successor to an empty string * is a new empty string: * * ```ruby * ''.succ # => "" * ``` * * Otherwise the successor is calculated by "incrementing" characters. The * first character to be incremented is the rightmost alphanumeric: or, if no * alphanumerics, the rightmost character: * * ```ruby * 'THX1138'.succ # => "THX1139" * '<<koala>>'.succ # => "<<koalb>>" * '***'.succ # => '**+' * ``` * * The successor to a digit is another digit, "carrying" to the next-left * character for a "rollover" from 9 to 0, and prepending another digit if * necessary: * * ```ruby * '00'.succ # => "01" * '09'.succ # => "10" * '99'.succ # => "100" * '-9'.succ # => "-10" * ``` * * The successor to a letter is another letter of the same case, carrying to * the next-left character for a rollover, and prepending another same-case * letter if necessary: * * ```ruby * 'aa'.succ # => "ab" * 'az'.succ # => "ba" * 'zz'.succ # => "aaa" * 'AA'.succ # => "AB" * 'AZ'.succ # => "BA" * 'ZZ'.succ # => "AAA" * ``` * * The successor to a non-alphanumeric character is the next character in the * underlying character set's collating sequence, carrying to the next-left * character for a rollover, and prepending another character if necessary: * * ```ruby * s = "\u03A1" * s.succ # => "\u03A3" # There is no such thing like \u03A2. * s = 255.chr * 3 * s # => "\xFF\xFF\xFF" * s.succ # => "\x01\x00\x00\x00" * ``` * * Carrying can occur between and among mixtures of alphanumeric characters: * * ```ruby * s = 'zz99zz99' * s.succ # => "aaa00aa00" * s = '99zz99zz' * s.succ # => "100aa00aa" * s = '1.9.9' * s.succ # => "2.0.0" * ``` * * @param[in] orig Predecessor string. * @return Successor string. */ VALUE rb_str_succ(VALUE orig); RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] str A C string. * @return `strlen`, casted to `long`. */ static inline long rbimpl_strlen(const char *str) { return RBIMPL_CAST((long)strlen(str)); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] str A C string literal. * @return Corresponding Ruby string. */ static inline VALUE rbimpl_str_new_cstr(const char *str) { long len = rbimpl_strlen(str); return rb_str_new_static(str, len); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] str A C string literal. * @return Corresponding Ruby string. */ static inline VALUE rbimpl_usascii_str_new_cstr(const char *str) { long len = rbimpl_strlen(str); return rb_usascii_str_new_static(str, len); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] str A C string literal. * @return Corresponding Ruby string. */ static inline VALUE rbimpl_utf8_str_new_cstr(const char *str) { long len = rbimpl_strlen(str); return rb_utf8_str_new_static(str, len); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] str A C string literal. * @return Corresponding Ruby string. */ static inline VALUE rbimpl_external_str_new_cstr(const char *str) { long len = rbimpl_strlen(str); return rb_external_str_new(str, len); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] str A C string literal. * @return Corresponding Ruby string. */ static inline VALUE rbimpl_locale_str_new_cstr(const char *str) { long len = rbimpl_strlen(str); return rb_locale_str_new(str, len); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] str A C string literal. * @return Corresponding Ruby string. */ static inline VALUE rbimpl_str_buf_new_cstr(const char *str) { long len = rbimpl_strlen(str); VALUE buf = rb_str_buf_new(len); return rb_str_buf_cat(buf, str, len); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[out] buf A string buffer. * @param[in] str A C string literal. * @return `buf` itself. */ static inline VALUE rbimpl_str_cat_cstr(VALUE buf, const char *str) { long len = rbimpl_strlen(str); return rb_str_cat(buf, str, len); } RBIMPL_ATTR_NONNULL(()) /** * @private * * This is an implementation detail. Don't bother. * * @param[in] exc An exception class. * @param[in] str A C string literal. * @return An instance of `exc`. */ static inline VALUE rbimpl_exc_new_cstr(VALUE exc, const char *str) { long len = rbimpl_strlen(str); return rb_exc_new(exc, str, len); } /** * Allocates an instance of ::rb_cString. * * @param[in] str A memory region of `len` bytes length. * @param[in] len Length of `ptr`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString, of `len` bytes length, of * "binary" encoding, whose contents are verbatim copy of `str`. * @pre At least `len` bytes of continuous memory region shall be * accessible via `str`. */ #define rb_str_new(str, len) \ ((RBIMPL_CONSTANT_P(str) && \ RBIMPL_CONSTANT_P(len) ? \ rb_str_new_static : \ rb_str_new) ((str), (len))) /** * Identical to #rb_str_new, except it assumes the passed pointer is a pointer * to a C string. * * @param[in] str A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString, of "binary" encoding, whose * contents are verbatim copy of `str`. * @pre `str` must not be a null pointer. */ #define rb_str_new_cstr(str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_str_new_cstr : \ rb_str_new_cstr) (str)) /** * Identical to #rb_str_new, except it generates a string of "US ASCII" * encoding. This is different from rb_external_str_new(), not only for the * output encoding, but also it doesn't convert the contents. * * @param[in] str A memory region of `len` bytes length. * @param[in] len Length of `str`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString, of `len` bytes length, of * "US ASCII" encoding, whose contents are verbatim copy of `str`. */ #define rb_usascii_str_new(str, len) \ ((RBIMPL_CONSTANT_P(str) && \ RBIMPL_CONSTANT_P(len) ? \ rb_usascii_str_new_static : \ rb_usascii_str_new) ((str), (len))) /** * Identical to #rb_str_new, except it generates a string of "UTF-8" encoding. * * @param[in] str A memory region of `len` bytes length. * @param[in] len Length of `str`, in bytes, not including the * terminating NUL character. * @exception rb_eNoMemError Failed to allocate `len+1` bytes. * @exception rb_eArgError `len` is negative. * @return An instance of ::rb_cString, of `len` bytes length, of * "UTF-8" encoding, whose contents are verbatim copy of `str`. */ #define rb_utf8_str_new(str, len) \ ((RBIMPL_CONSTANT_P(str) && \ RBIMPL_CONSTANT_P(len) ? \ rb_utf8_str_new_static : \ rb_utf8_str_new) ((str), (len))) /** * Identical to #rb_str_new_cstr, except it generates a string of "US ASCII" * encoding. It can also be seen as a routine Identical to * #rb_usascii_str_new, except it assumes the passed pointer is a pointer to a * C string. * * @param[in] str A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString, of "US ASCII" encoding, whose * contents are verbatim copy of `str`. * @pre `str` must not be a null pointer. */ #define rb_usascii_str_new_cstr(str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_usascii_str_new_cstr : \ rb_usascii_str_new_cstr) (str)) /** * Identical to #rb_str_new_cstr, except it generates a string of "UTF-8" * encoding. It can also be seen as a routine Identical to #rb_utf8_str_new, * except it assumes the passed pointer is a pointer to a C string. * * @param[in] str A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString, of "UTF-8" encoding, whose contents * are verbatim copy of `str`. * @pre `str` must not be a null pointer. */ #define rb_utf8_str_new_cstr(str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_utf8_str_new_cstr : \ rb_utf8_str_new_cstr) (str)) /** * Identical to #rb_str_new_cstr, except it generates a string of "default * external" encoding. * * @param[in] str A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "default external" is fully defined over * the given contents, then the return value is a string of * "default external" encoding, whose contents are the converted * ones. Otherwise the string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. * @pre `str` must not be a null pointer. */ #define rb_external_str_new_cstr(str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_external_str_new_cstr : \ rb_external_str_new_cstr) (str)) /** * Identical to #rb_external_str_new_cstr, except it generates a string of * "locale" encoding instead of "default external". * * @param[in] str A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString. In case encoding conversion from * "default internal" to "locale" is fully defined over the given * contents, then the return value is a string of "locale" * encoding, whose contents are the converted ones. Otherwise the * string is a junk. * @warning It doesn't raise on a conversion failure and silently ends up in * a corrupted output. You can know the failure by querying * `valid_encoding?` of the result object. * @pre `str` must not be a null pointer. */ #define rb_locale_str_new_cstr(str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_locale_str_new_cstr : \ rb_locale_str_new_cstr) (str)) /** * Identical to #rb_str_new_cstr, except done differently. * * @param[in] str A C string. * @exception rb_eNoMemError Failed to allocate memory. * @return An instance of ::rb_cString, of "binary" encoding, whose * contents are verbatim copy of `str`. * @pre `str` must not be a null pointer. */ #define rb_str_buf_new_cstr(str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_str_buf_new_cstr : \ rb_str_buf_new_cstr) (str)) /** * Identical to rb_str_cat(), except it assumes the passed pointer is a pointer * to a C string. * * @param[out] buf Destination object. * @param[in] str Contents to append. * @exception rb_eArgError Result string too big. * @return The passed `buf`. * @pre `buf` must not be any arbitrary objects except ::RString. * @pre `str` must not be a null pointer. * @post `buf` has the contents of `str` appended. */ #define rb_str_cat_cstr(buf, str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_str_cat_cstr : \ rb_str_cat_cstr) ((buf), (str))) /** * Identical to rb_exc_new(), except it assumes the passed pointer is a pointer * to a C string. * * @param[out] exc A subclass of ::rb_eException. * @param[in] str Message to raise. * @return An instance of `exc` whose message is `str`. * @pre `str` must not be a null pointer. */ #define rb_exc_new_cstr(exc, str) \ ((RBIMPL_CONSTANT_P(str) ? \ rbimpl_exc_new_cstr : \ rb_exc_new_cstr) ((exc), (str))) #define rb_str_new2 rb_str_new_cstr /**< @old{rb_str_new_cstr} */ #define rb_str_new3 rb_str_new_shared /**< @old{rb_str_new_shared} */ #define rb_str_new4 rb_str_new_frozen /**< @old{rb_str_new_frozen} */ #define rb_str_new5 rb_str_new_with_class /**< @old{rb_str_new_with_class} */ #define rb_str_buf_new2 rb_str_buf_new_cstr /**< @old{rb_str_buf_new_cstr} */ #define rb_usascii_str_new2 rb_usascii_str_new_cstr /**< @old{rb_usascii_str_new_cstr} */ #define rb_str_buf_cat rb_str_cat /**< @alias{rb_str_cat} */ #define rb_str_buf_cat2 rb_str_cat_cstr /**< @old{rb_usascii_str_new_cstr} */ #define rb_str_cat2 rb_str_cat_cstr /**< @old{rb_str_cat_cstr} */ /** * Length of a string literal. * * @param[in] str A C String literal. * @return An integer constant expression that represents `str`'s length, * in bytes, not including the terminating NUL character. */ #define rb_strlen_lit(str) (sizeof(str "") - 1) /** * Identical to rb_str_new_static(), except it cannot take string variables. * * @param[in] str A C string literal. * @pre `str` must not be a variable. * @return An instance of ::rb_cString, of "binary" encoding, whose backend * storage is the passed C string literal. * @warning It is a very bad idea to write to a C string literal (often * immediate SEGV shall occur). Consider return values of this * function be read-only. */ #define rb_str_new_lit(str) rb_str_new_static((str), rb_strlen_lit(str)) /** * Identical to rb_usascii_str_new_static(), except it cannot take string * variables. * * @param[in] str A C string literal. * @pre `str` must not be a variable. * @return An instance of ::rb_cString, of "US ASCII" encoding, whose * backend storage is the passed C string literal. * @warning It is a very bad idea to write to a C string literal (often * immediate SEGV shall occur). Consider return values of this * function be read-only. */ #define rb_usascii_str_new_lit(str) rb_usascii_str_new_static((str), rb_strlen_lit(str)) /** * Identical to rb_utf8_str_new_static(), except it cannot take string * variables. * * @param[in] str A C string literal. * @pre `str` must not be a variable. * @return An instance of ::rb_cString, of "UTF-8" encoding, whose backend * storage is the passed C string literal. * @warning It is a very bad idea to write to a C string literal (often * immediate SEGV shall occur). Consider return values of this * function be read-only. */ #define rb_utf8_str_new_lit(str) rb_utf8_str_new_static((str), rb_strlen_lit(str)) /** * Identical to rb_enc_str_new_static(), except it cannot take string * variables. * * @param[in] str A C string literal. * @param[in] enc A pointer to an encoding. * @pre `str` must not be a variable. * @return An instance of ::rb_cString, of the passed encoding, whose * backend storage is the passed C string literal. * @warning It is a very bad idea to write to a C string literal (often * immediate SEGV shall occur). Consider return values of this * function be read-only. */ #define rb_enc_str_new_lit(str, enc) rb_enc_str_new_static((str), rb_strlen_lit(str), (enc)) #define rb_str_new_literal(str) rb_str_new_lit(str) /**< @alias{rb_str_new_lit} */ #define rb_usascii_str_new_literal(str) rb_usascii_str_new_lit(str) /**< @alias{rb_usascii_str_new_lit} */ #define rb_utf8_str_new_literal(str) rb_utf8_str_new_lit(str) /**< @alias{rb_utf8_str_new_lit} */ #define rb_enc_str_new_literal(str, enc) rb_enc_str_new_lit(str, enc) /**< @alias{rb_enc_str_new_lit} */ RBIMPL_SYMBOL_EXPORT_END() #endif /* RBIMPL_INTERN_STRING_H */
Close