summaryrefslogtreecommitdiff
path: root/include/ruby/internal/intern/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ruby/internal/intern/string.h')
-rw-r--r--include/ruby/internal/intern/string.h1757
1 files changed, 0 insertions, 1757 deletions
diff --git a/include/ruby/internal/intern/string.h b/include/ruby/internal/intern/string.h
deleted file mode 100644
index 4573ec1262..0000000000
--- a/include/ruby/internal/intern/string.h
+++ /dev/null
@@ -1,1757 +0,0 @@
-#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 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
- * 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 the number of
- * `str`'s elements, not including the terminating NUL character.
- */
-#define rb_strlen_lit(str) ((sizeof(str "") / sizeof(str ""[0])) - 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 */