/* * Licensed under the GNU Lesser General Public License Version 3 * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the license, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . */ // generated automatically - do not change module glib.Str; private import core.stdc.stdio; private import core.stdc.string; private import glib.Str; private import glib.c.functions; public import glib.c.types; public import gobject.c.types; /** */ public struct Str { /* * Convert C-style 0 terminated string s to char[] string. * copied from phobos */ public static string toString(const(char)* s, size_t len = 0) { if ( s is null ) return cast(string)null; if ( len == 0 ) len = strlen(s); return s[0 .. len].idup; } /* * Convert array of chars s[] to a C-style 0 terminated string. * copied from phobos */ public static char* toStringz(string s) { if ( s is null ) return null; char[] copy; if (s.length == 0) { copy = "\0".dup; } else { // Need to make a copy copy = new char[s.length + 1]; copy[0..s.length] = s[]; copy[s.length] = 0; } return copy.ptr; } /** */ public static char** toStringzArray(string[] args) { if ( args is null ) { return null; } char** argv = (new char*[args.length]).ptr; int argc = 0; foreach (string p; args) { argv[argc++] = cast(char*)(p.dup~'\0'); } argv[argc] = null; return argv; } /** */ public static char*** toStringzArray(string[][] args) { if ( args is null ) { return null; } char**[] argv = new char**[args.length]; int argc = 0; foreach( string[] p; args ) { argv[argc++] = toStringzArray(p); } argv[argc] = null; return argv.ptr; } /** */ public static string[] toStringArray(const(char*)* args) { if ( args is null ) { return null; } string[] argv; while ( *args !is null ) { argv ~= toString(*args); args++; } return argv; } /** */ public static string[] toStringArray(const(char*)* args, size_t len) { string[] argv = new string[len]; for ( int i; i < len; i++ ) { argv[i] = toString(args[i]); } return argv; } /** */ public static string[][] toStringArray(char*** args) { string[][] argv; if ( args is null ) { return null; } while ( *args !is null ) { argv ~= toStringArray(*args); args++; } return argv; } /** */ public static void freeString(char* str) { g_free(str); } /** */ public static void freeStringArray(char** str) { g_strfreev(str); } /** */ public static void freeStringArray(char*** str) { while ( *str !is null ) { g_strfreev(*str); str++; } g_free(str); } /** */ /** * Determines the numeric value of a character as a decimal digit. * Differs from g_unichar_digit_value() because it takes a char, so * there's no worry about sign extension if characters are signed. * * Params: * c = an ASCII character * * Returns: If @c is a decimal digit (according to g_ascii_isdigit()), * its numeric value. Otherwise, -1. */ public static int asciiDigitValue(char c) { return g_ascii_digit_value(c); } /** * Converts a #gdouble to a string, using the '.' as * decimal point. * * This function generates enough precision that converting * the string back using g_ascii_strtod() gives the same machine-number * (on machines with IEEE compatible 64bit doubles). It is * guaranteed that the size of the resulting string will never * be larger than @G_ASCII_DTOSTR_BUF_SIZE bytes, including the terminating * nul character, which is always added. * * Params: * buffer = A buffer to place the resulting string in * bufLen = The length of the buffer. * d = The #gdouble to convert * * Returns: The pointer to the buffer with the converted string. */ public static string asciiDtostr(string buffer, int bufLen, double d) { auto retStr = g_ascii_dtostr(Str.toStringz(buffer), bufLen, d); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Converts a #gdouble to a string, using the '.' as * decimal point. To format the number you pass in * a printf()-style format string. Allowed conversion * specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'. * * The returned buffer is guaranteed to be nul-terminated. * * If you just want to want to serialize the value into a * string, use g_ascii_dtostr(). * * Params: * buffer = A buffer to place the resulting string in * bufLen = The length of the buffer. * format = The printf()-style format to use for the * code to use for converting. * d = The #gdouble to convert * * Returns: The pointer to the buffer with the converted string. */ public static string asciiFormatd(string buffer, int bufLen, string format, double d) { auto retStr = g_ascii_formatd(Str.toStringz(buffer), bufLen, Str.toStringz(format), d); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Compare two strings, ignoring the case of ASCII characters. * * Unlike the BSD strcasecmp() function, this only recognizes standard * ASCII letters and ignores the locale, treating all non-ASCII * bytes as if they are not letters. * * This function should be used only on strings that are known to be * in encodings where the bytes corresponding to ASCII letters always * represent themselves. This includes UTF-8 and the ISO-8859-* * charsets, but not for instance double-byte encodings like the * Windows Codepage 932, where the trailing bytes of double-byte * characters include all ASCII letters. If you compare two CP932 * strings using this function, you will get false matches. * * Both @s1 and @s2 must be non-%NULL. * * Params: * s1 = string to compare with @s2 * s2 = string to compare with @s1 * * Returns: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. */ public static int asciiStrcasecmp(string s1, string s2) { return g_ascii_strcasecmp(Str.toStringz(s1), Str.toStringz(s2)); } /** * Converts all upper case ASCII letters to lower case ASCII letters. * * Params: * str = a string * len = length of @str in bytes, or -1 if @str is nul-terminated * * Returns: a newly-allocated string, with all the upper case * characters in @str converted to lower case, with semantics that * exactly match g_ascii_tolower(). (Note that this is unlike the * old g_strdown(), which modified the string in place.) */ public static string asciiStrdown(string str, ptrdiff_t len) { auto retStr = g_ascii_strdown(Str.toStringz(str), len); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Compare @s1 and @s2, ignoring the case of ASCII characters and any * characters after the first @n in each string. * * Unlike the BSD strcasecmp() function, this only recognizes standard * ASCII letters and ignores the locale, treating all non-ASCII * characters as if they are not letters. * * The same warning as in g_ascii_strcasecmp() applies: Use this * function only on strings known to be in encodings where bytes * corresponding to ASCII letters always represent themselves. * * Params: * s1 = string to compare with @s2 * s2 = string to compare with @s1 * n = number of characters to compare * * Returns: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. */ public static int asciiStrncasecmp(string s1, string s2, size_t n) { return g_ascii_strncasecmp(Str.toStringz(s1), Str.toStringz(s2), n); } /** * Converts a string to a #gdouble value. * * This function behaves like the standard strtod() function * does in the C locale. It does this without actually changing * the current locale, since that would not be thread-safe. * A limitation of the implementation is that this function * will still accept localized versions of infinities and NANs. * * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the * locale-sensitive system strtod() function. * * To convert from a #gdouble to a string in a locale-insensitive * way, use g_ascii_dtostr(). * * If the correct value would cause overflow, plus or minus %HUGE_VAL * is returned (according to the sign of the value), and %ERANGE is * stored in %errno. If the correct value would cause underflow, * zero is returned and %ERANGE is stored in %errno. * * This function resets %errno before calling strtod() so that * you can reliably detect overflow and underflow. * * Params: * nptr = the string to convert to a numeric value. * endptr = if non-%NULL, it returns the character after * the last character used in the conversion. * * Returns: the #gdouble value. */ public static double asciiStrtod(string nptr, string[] endptr) { return g_ascii_strtod(Str.toStringz(nptr), Str.toStringzArray(endptr)); } /** * Converts a string to a #gint64 value. * This function behaves like the standard strtoll() function * does in the C locale. It does this without actually * changing the current locale, since that would not be * thread-safe. * * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the * locale-sensitive system strtoll() function. * * If the correct value would cause overflow, %G_MAXINT64 or %G_MININT64 * is returned, and `ERANGE` is stored in `errno`. * If the base is outside the valid range, zero is returned, and * `EINVAL` is stored in `errno`. If the * string conversion fails, zero is returned, and @endptr returns @nptr * (if @endptr is non-%NULL). * * Params: * nptr = the string to convert to a numeric value. * endptr = if non-%NULL, it returns the character after * the last character used in the conversion. * base = to be used for the conversion, 2..36 or 0 * * Returns: the #gint64 value or zero on error. * * Since: 2.12 */ public static long asciiStrtoll(string nptr, string[] endptr, uint base) { return g_ascii_strtoll(Str.toStringz(nptr), Str.toStringzArray(endptr), base); } /** * Converts a string to a #guint64 value. * This function behaves like the standard strtoull() function * does in the C locale. It does this without actually * changing the current locale, since that would not be * thread-safe. * * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the * locale-sensitive system strtoull() function. * * If the correct value would cause overflow, %G_MAXUINT64 * is returned, and `ERANGE` is stored in `errno`. * If the base is outside the valid range, zero is returned, and * `EINVAL` is stored in `errno`. * If the string conversion fails, zero is returned, and @endptr returns * @nptr (if @endptr is non-%NULL). * * Params: * nptr = the string to convert to a numeric value. * endptr = if non-%NULL, it returns the character after * the last character used in the conversion. * base = to be used for the conversion, 2..36 or 0 * * Returns: the #guint64 value or zero on error. * * Since: 2.2 */ public static ulong asciiStrtoull(string nptr, string[] endptr, uint base) { return g_ascii_strtoull(Str.toStringz(nptr), Str.toStringzArray(endptr), base); } /** * Converts all lower case ASCII letters to upper case ASCII letters. * * Params: * str = a string * len = length of @str in bytes, or -1 if @str is nul-terminated * * Returns: a newly allocated string, with all the lower case * characters in @str converted to upper case, with semantics that * exactly match g_ascii_toupper(). (Note that this is unlike the * old g_strup(), which modified the string in place.) */ public static string asciiStrup(string str, ptrdiff_t len) { auto retStr = g_ascii_strup(Str.toStringz(str), len); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Convert a character to ASCII lower case. * * Unlike the standard C library tolower() function, this only * recognizes standard ASCII letters and ignores the locale, returning * all non-ASCII characters unchanged, even if they are lower case * letters in a particular character set. Also unlike the standard * library function, this takes and returns a char, not an int, so * don't call it on %EOF but no need to worry about casting to #guchar * before passing a possibly non-ASCII character in. * * Params: * c = any character * * Returns: the result of converting @c to lower case. If @c is * not an ASCII upper case letter, @c is returned unchanged. */ public static char asciiTolower(char c) { return g_ascii_tolower(c); } /** * Convert a character to ASCII upper case. * * Unlike the standard C library toupper() function, this only * recognizes standard ASCII letters and ignores the locale, returning * all non-ASCII characters unchanged, even if they are upper case * letters in a particular character set. Also unlike the standard * library function, this takes and returns a char, not an int, so * don't call it on %EOF but no need to worry about casting to #guchar * before passing a possibly non-ASCII character in. * * Params: * c = any character * * Returns: the result of converting @c to upper case. If @c is not * an ASCII lower case letter, @c is returned unchanged. */ public static char asciiToupper(char c) { return g_ascii_toupper(c); } /** * Determines the numeric value of a character as a hexidecimal * digit. Differs from g_unichar_xdigit_value() because it takes * a char, so there's no worry about sign extension if characters * are signed. * * Params: * c = an ASCII character. * * Returns: If @c is a hex digit (according to g_ascii_isxdigit()), * its numeric value. Otherwise, -1. */ public static int asciiXdigitValue(char c) { return g_ascii_xdigit_value(c); } /** * Calculates the maximum space needed to store the output * of the sprintf() function. * * Params: * format = the format string. See the printf() documentation * args = the parameters to be inserted into the format string * * Returns: the maximum space needed to store the formatted string */ public static size_t printfStringUpperBound(string format, void* args) { return g_printf_string_upper_bound(Str.toStringz(format), args); } /** * Copies a nul-terminated string into the dest buffer, include the * trailing nul, and return a pointer to the trailing nul byte. * This is useful for concatenating multiple strings together * without having to repeatedly scan for the end. * * Params: * dest = destination buffer. * src = source string. * * Returns: a pointer to trailing nul byte. */ public static string stpcpy(string dest, string src) { auto retStr = g_stpcpy(Str.toStringz(dest), Str.toStringz(src)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Looks whether the string @str begins with @prefix. * * Params: * str = a nul-terminated string * prefix = the nul-terminated prefix to look for * * Returns: %TRUE if @str begins with @prefix, %FALSE otherwise. * * Since: 2.2 */ public static bool hasPrefix(string str, string prefix) { return g_str_has_prefix(Str.toStringz(str), Str.toStringz(prefix)) != 0; } /** * Looks whether the string @str ends with @suffix. * * Params: * str = a nul-terminated string * suffix = the nul-terminated suffix to look for * * Returns: %TRUE if @str end with @suffix, %FALSE otherwise. * * Since: 2.2 */ public static bool hasSuffix(string str, string suffix) { return g_str_has_suffix(Str.toStringz(str), Str.toStringz(suffix)) != 0; } /** * Determines if a string is pure ASCII. A string is pure ASCII if it * contains no bytes with the high bit set. * * Params: * str = a string * * Returns: %TRUE if @str is ASCII * * Since: 2.40 */ public static bool isAscii(string str) { return g_str_is_ascii(Str.toStringz(str)) != 0; } /** * Checks if a search conducted for @search_term should match * @potential_hit. * * This function calls g_str_tokenize_and_fold() on both * @search_term and @potential_hit. ASCII alternates are never taken * for @search_term but will be taken for @potential_hit according to * the value of @accept_alternates. * * A hit occurs when each folded token in @search_term is a prefix of a * folded token from @potential_hit. * * Depending on how you're performing the search, it will typically be * faster to call g_str_tokenize_and_fold() on each string in * your corpus and build an index on the returned folded tokens, then * call g_str_tokenize_and_fold() on the search term and * perform lookups into that index. * * As some examples, searching for "fred" would match the potential hit * "Smith, Fred" and also "Frédéric". Searching for "Fréd" would match * "Frédéric" but not "Frederic" (due to the one-directional nature of * accent matching). Searching "fo" would match "Foo" and "Bar Foo * Baz", but not "SFO" (because no word as "fo" as a prefix). * * Params: * searchTerm = the search term from the user * potentialHit = the text that may be a hit * acceptAlternates = %TRUE to accept ASCII alternates * * Returns: %TRUE if @potential_hit is a hit * * Since: 2.40 */ public static bool matchString(string searchTerm, string potentialHit, bool acceptAlternates) { return g_str_match_string(Str.toStringz(searchTerm), Str.toStringz(potentialHit), acceptAlternates) != 0; } /** * Transliterate @str to plain ASCII. * * For best results, @str should be in composed normalised form. * * This function performs a reasonably good set of character * replacements. The particular set of replacements that is done may * change by version or even by runtime environment. * * If the source language of @str is known, it can used to improve the * accuracy of the translation by passing it as @from_locale. It should * be a valid POSIX locale string (of the form * "language[_territory][.codeset][@modifier]"). * * If @from_locale is %NULL then the current locale is used. * * If you want to do translation for no specific locale, and you want it * to be done independently of the currently locale, specify "C" for * @from_locale. * * Params: * str = a string, in UTF-8 * fromLocale = the source locale, if known * * Returns: a string in plain ASCII */ public static string toAscii(string str, string fromLocale) { auto retStr = g_str_to_ascii(Str.toStringz(str), Str.toStringz(fromLocale)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Tokenises @string and performs folding on each token. * * A token is a non-empty sequence of alphanumeric characters in the * source string, separated by non-alphanumeric characters. An * "alphanumeric" character for this purpose is one that matches * g_unichar_isalnum() or g_unichar_ismark(). * * Each token is then (Unicode) normalised and case-folded. If * @ascii_alternates is non-%NULL and some of the returned tokens * contain non-ASCII characters, ASCII alternatives will be generated. * * The number of ASCII alternatives that are generated and the method * for doing so is unspecified, but @translit_locale (if specified) may * improve the transliteration if the language of the source string is * known. * * Params: * str = a string * translitLocale = the language code (like 'de' or * 'en_GB') from which @string originates * asciiAlternates = a * return location for ASCII alternates * * Returns: the folded tokens * * Since: 2.40 */ public static string[] tokenizeAndFold(string str, string translitLocale, out string[] asciiAlternates) { char** outasciiAlternates = null; auto retStr = g_str_tokenize_and_fold(Str.toStringz(str), Str.toStringz(translitLocale), &outasciiAlternates); asciiAlternates = Str.toStringArray(outasciiAlternates); scope(exit) Str.freeStringArray(retStr); return Str.toStringArray(retStr); } /** * For each character in @string, if the character is not in @valid_chars, * replaces the character with @substitutor. Modifies @string in place, * and return @string itself, not a copy. The return value is to allow * nesting such as * |[ * g_ascii_strup (g_strcanon (str, "abc", '?')) * ]| * * Params: * str = a nul-terminated array of bytes * validChars = bytes permitted in @string * substitutor = replacement character for disallowed bytes * * Returns: @string */ public static string strcanon(string str, string validChars, char substitutor) { auto retStr = g_strcanon(Str.toStringz(str), Str.toStringz(validChars), substitutor); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * A case-insensitive string comparison, corresponding to the standard * strcasecmp() function on platforms which support it. * * Deprecated: See g_strncasecmp() for a discussion of why this * function is deprecated and how to replace it. * * Params: * s1 = a string * s2 = a string to compare with @s1 * * Returns: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. */ public static int strcasecmp(string s1, string s2) { return g_strcasecmp(Str.toStringz(s1), Str.toStringz(s2)); } /** * Removes trailing whitespace from a string. * * This function doesn't allocate or reallocate any memory; * it modifies @string in place. Therefore, it cannot be used * on statically allocated strings. * * The pointer to @string is returned to allow the nesting of functions. * * Also see g_strchug() and g_strstrip(). * * Params: * str = a string to remove the trailing whitespace from * * Returns: @string */ public static string strchomp(string str) { auto retStr = g_strchomp(Str.toStringz(str)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Removes leading whitespace from a string, by moving the rest * of the characters forward. * * This function doesn't allocate or reallocate any memory; * it modifies @string in place. Therefore, it cannot be used on * statically allocated strings. * * The pointer to @string is returned to allow the nesting of functions. * * Also see g_strchomp() and g_strstrip(). * * Params: * str = a string to remove the leading whitespace from * * Returns: @string */ public static string strchug(string str) { auto retStr = g_strchug(Str.toStringz(str)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Compares @str1 and @str2 like strcmp(). Handles %NULL * gracefully by sorting it before non-%NULL strings. * Comparing two %NULL pointers returns 0. * * Params: * str1 = a C string or %NULL * str2 = another C string or %NULL * * Returns: an integer less than, equal to, or greater than zero, if @str1 is <, == or > than @str2. * * Since: 2.16 */ public static int strcmp0(string str1, string str2) { return g_strcmp0(Str.toStringz(str1), Str.toStringz(str2)); } /** * Replaces all escaped characters with their one byte equivalent. * * This function does the reverse conversion of g_strescape(). * * Params: * source = a string to compress * * Returns: a newly-allocated copy of @source with all escaped * character compressed */ public static string strcompress(string source) { auto retStr = g_strcompress(Str.toStringz(source)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Converts any delimiter characters in @string to @new_delimiter. * Any characters in @string which are found in @delimiters are * changed to the @new_delimiter character. Modifies @string in place, * and returns @string itself, not a copy. The return value is to * allow nesting such as * |[ * g_ascii_strup (g_strdelimit (str, "abc", '?')) * ]| * * Params: * str = the string to convert * delimiters = a string containing the current delimiters, * or %NULL to use the standard delimiters defined in #G_STR_DELIMITERS * newDelimiter = the new delimiter character * * Returns: @string */ public static string strdelimit(string str, string delimiters, char newDelimiter) { auto retStr = g_strdelimit(Str.toStringz(str), Str.toStringz(delimiters), newDelimiter); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Converts a string to lower case. * * Deprecated: This function is totally broken for the reasons discussed * in the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown() * instead. * * Params: * str = the string to convert. * * Returns: the string */ public static string strdown(string str) { auto retStr = g_strdown(Str.toStringz(str)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Duplicates a string. If @str is %NULL it returns %NULL. * The returned string should be freed with g_free() * when no longer needed. * * Params: * str = the string to duplicate * * Returns: a newly-allocated copy of @str */ public static string strdup(string str) { auto retStr = g_strdup(Str.toStringz(str)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Similar to the standard C vsprintf() function but safer, since it * calculates the maximum space required and allocates memory to hold * the result. The returned string should be freed with g_free() when * no longer needed. * * See also g_vasprintf(), which offers the same functionality, but * additionally returns the length of the allocated string. * * Params: * format = a standard printf() format string, but notice * [string precision pitfalls][string-precision] * args = the list of parameters to insert into the format string * * Returns: a newly-allocated string holding the result */ public static string strdupVprintf(string format, void* args) { auto retStr = g_strdup_vprintf(Str.toStringz(format), args); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Copies %NULL-terminated array of strings. The copy is a deep copy; * the new array should be freed by first freeing each string, then * the array itself. g_strfreev() does this for you. If called * on a %NULL value, g_strdupv() simply returns %NULL. * * Params: * strArray = a %NULL-terminated array of strings * * Returns: a new %NULL-terminated array of strings. */ public static string[] strdupv(string[] strArray) { return Str.toStringArray(g_strdupv(Str.toStringzArray(strArray))); } /** * Returns a string corresponding to the given error code, e.g. "no * such process". Unlike strerror(), this always returns a string in * UTF-8 encoding, and the pointer is guaranteed to remain valid for * the lifetime of the process. * * Note that the string may be translated according to the current locale. * * The value of %errno will not be changed by this function. * * Params: * errnum = the system error number. See the standard C %errno * documentation * * Returns: a UTF-8 string describing the error code. If the error code * is unknown, it returns a string like "unknown error ()". */ public static string strerror(int errnum) { return Str.toString(g_strerror(errnum)); } /** * Escapes the special characters '\b', '\f', '\n', '\r', '\t', '\v', '\' * and '"' in the string @source by inserting a '\' before * them. Additionally all characters in the range 0x01-0x1F (everything * below SPACE) and in the range 0x7F-0xFF (all non-ASCII chars) are * replaced with a '\' followed by their octal representation. * Characters supplied in @exceptions are not escaped. * * g_strcompress() does the reverse conversion. * * Params: * source = a string to escape * exceptions = a string of characters not to escape in @source * * Returns: a newly-allocated copy of @source with certain * characters escaped. See above. */ public static string strescape(string source, string exceptions) { auto retStr = g_strescape(Str.toStringz(source), Str.toStringz(exceptions)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Frees a %NULL-terminated array of strings, as well as each * string it contains. * * If @str_array is %NULL, this function simply returns. * * Params: * strArray = a %NULL-terminated array of strings to free */ public static void strfreev(string[] strArray) { g_strfreev(Str.toStringzArray(strArray)); } /** * Joins a number of strings together to form one long string, with the * optional @separator inserted between each of them. The returned string * should be freed with g_free(). * * Params: * separator = a string to insert between each of the * strings, or %NULL * strArray = a %NULL-terminated array of strings to join * * Returns: a newly-allocated string containing all of the strings joined * together, with @separator between them */ public static string strjoinv(string separator, string[] strArray) { auto retStr = g_strjoinv(Str.toStringz(separator), Str.toStringzArray(strArray)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Portability wrapper that calls strlcat() on systems which have it, * and emulates it otherwise. Appends nul-terminated @src string to @dest, * guaranteeing nul-termination for @dest. The total size of @dest won't * exceed @dest_size. * * At most @dest_size - 1 characters will be copied. Unlike strncat(), * @dest_size is the full size of dest, not the space left over. This * function does not allocate memory. It always nul-terminates (unless * @dest_size == 0 or there were no nul characters in the @dest_size * characters of dest to start with). * * Caveat: this is supposedly a more secure alternative to strcat() or * strncat(), but for real security g_strconcat() is harder to mess up. * * Params: * dest = destination buffer, already containing one nul-terminated string * src = source buffer * destSize = length of @dest buffer in bytes (not length of existing string * inside @dest) * * Returns: size of attempted result, which is MIN (dest_size, strlen * (original dest)) + strlen (src), so if retval >= dest_size, * truncation occurred. */ public static size_t strlcat(string dest, string src, size_t destSize) { return g_strlcat(Str.toStringz(dest), Str.toStringz(src), destSize); } /** * Portability wrapper that calls strlcpy() on systems which have it, * and emulates strlcpy() otherwise. Copies @src to @dest; @dest is * guaranteed to be nul-terminated; @src must be nul-terminated; * @dest_size is the buffer size, not the number of bytes to copy. * * At most @dest_size - 1 characters will be copied. Always nul-terminates * (unless @dest_size is 0). This function does not allocate memory. Unlike * strncpy(), this function doesn't pad @dest (so it's often faster). It * returns the size of the attempted result, strlen (src), so if * @retval >= @dest_size, truncation occurred. * * Caveat: strlcpy() is supposedly more secure than strcpy() or strncpy(), * but if you really want to avoid screwups, g_strdup() is an even better * idea. * * Params: * dest = destination buffer * src = source buffer * destSize = length of @dest in bytes * * Returns: length of @src */ public static size_t strlcpy(string dest, string src, size_t destSize) { return g_strlcpy(Str.toStringz(dest), Str.toStringz(src), destSize); } /** * A case-insensitive string comparison, corresponding to the standard * strncasecmp() function on platforms which support it. It is similar * to g_strcasecmp() except it only compares the first @n characters of * the strings. * * Deprecated: The problem with g_strncasecmp() is that it does * the comparison by calling toupper()/tolower(). These functions * are locale-specific and operate on single bytes. However, it is * impossible to handle things correctly from an internationalization * standpoint by operating on bytes, since characters may be multibyte. * Thus g_strncasecmp() is broken if your string is guaranteed to be * ASCII, since it is locale-sensitive, and it's broken if your string * is localized, since it doesn't work on many encodings at all, * including UTF-8, EUC-JP, etc. * * There are therefore two replacement techniques: g_ascii_strncasecmp(), * which only works on ASCII and is not locale-sensitive, and * g_utf8_casefold() followed by strcmp() on the resulting strings, * which is good for case-insensitive sorting of UTF-8. * * Params: * s1 = a string * s2 = a string to compare with @s1 * n = the maximum number of characters to compare * * Returns: 0 if the strings match, a negative value if @s1 < @s2, * or a positive value if @s1 > @s2. */ public static int strncasecmp(string s1, string s2, uint n) { return g_strncasecmp(Str.toStringz(s1), Str.toStringz(s2), n); } /** * Duplicates the first @n bytes of a string, returning a newly-allocated * buffer @n + 1 bytes long which will always be nul-terminated. If @str * is less than @n bytes long the buffer is padded with nuls. If @str is * %NULL it returns %NULL. The returned value should be freed when no longer * needed. * * To copy a number of characters from a UTF-8 encoded string, * use g_utf8_strncpy() instead. * * Params: * str = the string to duplicate * n = the maximum number of bytes to copy from @str * * Returns: a newly-allocated buffer containing the first @n bytes * of @str, nul-terminated */ public static string strndup(string str, size_t n) { auto retStr = g_strndup(Str.toStringz(str), n); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Creates a new string @length bytes long filled with @fill_char. * The returned string should be freed when no longer needed. * * Params: * length = the length of the new string * fillChar = the byte to fill the string with * * Returns: a newly-allocated string filled the @fill_char */ public static string strnfill(size_t length, char fillChar) { auto retStr = g_strnfill(length, fillChar); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Reverses all of the bytes in a string. For example, * `g_strreverse ("abcdef")` will result in "fedcba". * * Note that g_strreverse() doesn't work on UTF-8 strings * containing multibyte characters. For that purpose, use * g_utf8_strreverse(). * * Params: * str = the string to reverse * * Returns: the same pointer passed in as @string */ public static string strreverse(string str) { auto retStr = g_strreverse(Str.toStringz(str)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Searches the string @haystack for the last occurrence * of the string @needle. * * Params: * haystack = a nul-terminated string * needle = the nul-terminated string to search for * * Returns: a pointer to the found occurrence, or * %NULL if not found. */ public static string strrstr(string haystack, string needle) { auto retStr = g_strrstr(Str.toStringz(haystack), Str.toStringz(needle)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Searches the string @haystack for the last occurrence * of the string @needle, limiting the length of the search * to @haystack_len. * * Params: * haystack = a nul-terminated string * haystackLen = the maximum length of @haystack * needle = the nul-terminated string to search for * * Returns: a pointer to the found occurrence, or * %NULL if not found. */ public static string strrstrLen(string haystack, ptrdiff_t haystackLen, string needle) { auto retStr = g_strrstr_len(Str.toStringz(haystack), haystackLen, Str.toStringz(needle)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Returns a string describing the given signal, e.g. "Segmentation fault". * You should use this function in preference to strsignal(), because it * returns a string in UTF-8 encoding, and since not all platforms support * the strsignal() function. * * Params: * signum = the signal number. See the `signal` documentation * * Returns: a UTF-8 string describing the signal. If the signal is unknown, * it returns "unknown signal ()". */ public static string strsignal(int signum) { return Str.toString(g_strsignal(signum)); } /** * Splits a string into a maximum of @max_tokens pieces, using the given * @delimiter. If @max_tokens is reached, the remainder of @string is * appended to the last token. * * As an example, the result of g_strsplit (":a:bc::d:", ":", -1) is a * %NULL-terminated vector containing the six strings "", "a", "bc", "", "d" * and "". * * As a special case, the result of splitting the empty string "" is an empty * vector, not a vector containing a single string. The reason for this * special case is that being able to represent a empty vector is typically * more useful than consistent handling of empty elements. If you do need * to represent empty elements, you'll need to check for the empty string * before calling g_strsplit(). * * Params: * str = a string to split * delimiter = a string which specifies the places at which to split * the string. The delimiter is not included in any of the resulting * strings, unless @max_tokens is reached. * maxTokens = the maximum number of pieces to split @string into. * If this is less than 1, the string is split completely. * * Returns: a newly-allocated %NULL-terminated array of strings. Use * g_strfreev() to free it. */ public static string[] strsplit(string str, string delimiter, int maxTokens) { return Str.toStringArray(g_strsplit(Str.toStringz(str), Str.toStringz(delimiter), maxTokens)); } /** * Splits @string into a number of tokens not containing any of the characters * in @delimiter. A token is the (possibly empty) longest string that does not * contain any of the characters in @delimiters. If @max_tokens is reached, the * remainder is appended to the last token. * * For example the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is a * %NULL-terminated vector containing the three strings "abc", "def", * and "ghi". * * The result of g_strsplit_set (":def/ghi:", ":/", -1) is a %NULL-terminated * vector containing the four strings "", "def", "ghi", and "". * * As a special case, the result of splitting the empty string "" is an empty * vector, not a vector containing a single string. The reason for this * special case is that being able to represent a empty vector is typically * more useful than consistent handling of empty elements. If you do need * to represent empty elements, you'll need to check for the empty string * before calling g_strsplit_set(). * * Note that this function works on bytes not characters, so it can't be used * to delimit UTF-8 strings for anything but ASCII characters. * * Params: * str = The string to be tokenized * delimiters = A nul-terminated string containing bytes that are used * to split the string. * maxTokens = The maximum number of tokens to split @string into. * If this is less than 1, the string is split completely * * Returns: a newly-allocated %NULL-terminated array of strings. Use * g_strfreev() to free it. * * Since: 2.4 */ public static string[] strsplitSet(string str, string delimiters, int maxTokens) { return Str.toStringArray(g_strsplit_set(Str.toStringz(str), Str.toStringz(delimiters), maxTokens)); } /** * Searches the string @haystack for the first occurrence * of the string @needle, limiting the length of the search * to @haystack_len. * * Params: * haystack = a string * haystackLen = the maximum length of @haystack. Note that -1 is * a valid length, if @haystack is nul-terminated, meaning it will * search through the whole string. * needle = the string to search for * * Returns: a pointer to the found occurrence, or * %NULL if not found. */ public static string strstrLen(string haystack, ptrdiff_t haystackLen, string needle) { auto retStr = g_strstr_len(Str.toStringz(haystack), haystackLen, Str.toStringz(needle)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** * Converts a string to a #gdouble value. * It calls the standard strtod() function to handle the conversion, but * if the string is not completely converted it attempts the conversion * again with g_ascii_strtod(), and returns the best match. * * This function should seldom be used. The normal situation when reading * numbers not for human consumption is to use g_ascii_strtod(). Only when * you know that you must expect both locale formatted and C formatted numbers * should you use this. Make sure that you don't pass strings such as comma * separated lists of values, since the commas may be interpreted as a decimal * point in some locales, causing unexpected results. * * Params: * nptr = the string to convert to a numeric value. * endptr = if non-%NULL, it returns the character after * the last character used in the conversion. * * Returns: the #gdouble value. */ public static double strtod(string nptr, string[] endptr) { return g_strtod(Str.toStringz(nptr), Str.toStringzArray(endptr)); } /** * Converts a string to upper case. * * Deprecated: This function is totally broken for the reasons * discussed in the g_strncasecmp() docs - use g_ascii_strup() * or g_utf8_strup() instead. * * Params: * str = the string to convert * * Returns: the string */ public static string strup(string str) { auto retStr = g_strup(Str.toStringz(str)); scope(exit) Str.freeString(retStr); return Str.toString(retStr); } /** */ public static GType strvGetType() { return g_strv_get_type(); } /** * Returns the length of the given %NULL-terminated * string array @str_array. * * Params: * strArray = a %NULL-terminated array of strings * * Returns: length of @str_array. * * Since: 2.6 */ public static uint strvLength(string[] strArray) { return g_strv_length(Str.toStringzArray(strArray)); } /** * Checks if @strv contains @str. @strv must not be %NULL. * * Params: * strv = a %NULL-terminated array of strings * str = a string * * Returns: %TRUE if @str is an element of @strv, according to g_str_equal(). * * Since: 2.44 */ public static bool strvContains(string strv, string str) { return g_strv_contains(Str.toStringz(strv), Str.toStringz(str)) != 0; } /** * An implementation of the GNU vasprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * This function is similar to g_vsprintf(), except that it allocates a * string to hold the output, instead of putting the output in a buffer * you allocate in advance. * * Params: * str = the return location for the newly-allocated string. * format = a standard printf() format string, but notice * [string precision pitfalls][string-precision] * args = the list of arguments to insert in the output. * * Returns: the number of bytes printed. * * Since: 2.4 */ public static int vasprintf(string[] str, string format, void* args) { return g_vasprintf(Str.toStringzArray(str), Str.toStringz(format), args); } /** * An implementation of the standard fprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Params: * file = the stream to write to. * format = a standard printf() format string, but notice * [string precision pitfalls][string-precision] * args = the list of arguments to insert in the output. * * Returns: the number of bytes printed. * * Since: 2.2 */ public static int vfprintf(FILE* file, string format, void* args) { return g_vfprintf(file, Str.toStringz(format), args); } /** * An implementation of the standard vprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Params: * format = a standard printf() format string, but notice * [string precision pitfalls][string-precision] * args = the list of arguments to insert in the output. * * Returns: the number of bytes printed. * * Since: 2.2 */ public static int vprintf(string format, void* args) { return g_vprintf(Str.toStringz(format), args); } /** * A safer form of the standard vsprintf() function. The output is guaranteed * to not exceed @n characters (including the terminating nul character), so * it is easy to ensure that a buffer overflow cannot occur. * * See also g_strdup_vprintf(). * * In versions of GLib prior to 1.2.3, this function may return -1 if the * output was truncated, and the truncated string may not be nul-terminated. * In versions prior to 1.3.12, this function returns the length of the output * string. * * The return value of g_vsnprintf() conforms to the vsnprintf() function * as standardized in ISO C99. Note that this is different from traditional * vsnprintf(), which returns the length of the output string. * * The format string may contain positional parameters, as specified in * the Single Unix Specification. * * Params: * str = the buffer to hold the output. * n = the maximum number of bytes to produce (including the * terminating nul character). * format = a standard printf() format string, but notice * string precision pitfalls][string-precision] * args = the list of arguments to insert in the output. * * Returns: the number of bytes which would be produced if the buffer * was large enough. */ public static int vsnprintf(string str, gulong n, string format, void* args) { return g_vsnprintf(Str.toStringz(str), n, Str.toStringz(format), args); } /** * An implementation of the standard vsprintf() function which supports * positional parameters, as specified in the Single Unix Specification. * * Params: * str = the buffer to hold the output. * format = a standard printf() format string, but notice * [string precision pitfalls][string-precision] * args = the list of arguments to insert in the output. * * Returns: the number of bytes printed. * * Since: 2.2 */ public static int vsprintf(string str, string format, void* args) { return g_vsprintf(Str.toStringz(str), Str.toStringz(format), args); } }