blob: 545856cab48531be2d0c1704fb585948e6b81669 [file] [log] [blame]
// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Module Overview: Starboard String module
//
// Defines functions for interacting with c-style strings.
#ifndef STARBOARD_STRING_H_
#define STARBOARD_STRING_H_
#include <stdarg.h>
#include "starboard/configuration.h"
#include "starboard/export.h"
#include "starboard/types.h"
#ifdef __cplusplus
extern "C" {
#endif
// Returns the length, in characters, of |str|.
//
// |str|: A zero-terminated ASCII string.
SB_EXPORT size_t SbStringGetLength(const char* str);
// Returns the length of a wide character string. (This function is the same
// as SbStringGetLength, but for a string comprised of wide characters.) This
// function assumes that there are no multi-element characters.
//
// |str|: A zero-terminated ASCII string.
SB_EXPORT size_t SbStringGetLengthWide(const wchar_t* str);
// Copies as much of a |source| string as possible and null-terminates it,
// given that |destination_size| characters of storage are available. This
// function is meant to be a drop-in replacement for |strlcpy|.
//
// The return value specifies the length of |source|.
//
// |out_destination|: The location to which the string is copied.
// |source|: The string to be copied.
// |destination_size|: The amount of the source string to copy.
SB_EXPORT int SbStringCopy(char* out_destination,
const char* source,
int destination_size);
// An inline wrapper for an unsafe SbStringCopy that assumes that the
// destination provides enough storage space for the entire string. The return
// value is a pointer to the destination string. This function is meant to be
// a drop-in replacement for |strcpy|.
//
// |out_destination|: The location to which the string is copied.
// |source|: The string to be copied.
static SB_C_INLINE char* SbStringCopyUnsafe(char* out_destination,
const char* source) {
SbStringCopy(out_destination, source, INT_MAX);
return out_destination;
}
// Identical to SbStringCopy, but for wide characters.
//
// |out_destination|: The location to which the string is copied.
// |source|: The string to be copied.
// |destination_size|: The amount of the source string to copy.
SB_EXPORT int SbStringCopyWide(wchar_t* out_destination,
const wchar_t* source,
int destination_size);
// Appends |source| to |out_destination| as long as |out_destination| has
// enough storage space to hold the concatenated string.
//
// This function is meant to be a drop-in replacement for |strlcat|. Also note
// that this function's signature is NOT compatible with |strncat|.
//
// |out_destination|: The string to which the |source| string is appended.
// |source|: The string to be appended to the destination string.
// |destination_size|: The amount of storage space available for the
// concatenated string.
SB_EXPORT int SbStringConcat(char* out_destination,
const char* source,
int destination_size);
// An inline wrapper for an unsafe SbStringConcat that assumes that the
// |out_destination| provides enough storage space for the concatenated string.
// Note that this function's signature is NOT compatible with |strcat|.
//
// |out_destination|: The string to which the |source| string is appended.
// |source|: The string to be appended to the destination string.
static SB_C_INLINE int SbStringConcatUnsafe(char* out_destination,
const char* source) {
return SbStringConcat(out_destination, source, INT_MAX);
}
// Identical to SbStringCat, but for wide characters.
//
// |out_destination|: The string to which the |source| string is appended.
// |source|: The string to be appended to the destination string.
// |destination_size|: The amount of storage space available for the
// concatenated string.
SB_EXPORT int SbStringConcatWide(wchar_t* out_destination,
const wchar_t* source,
int destination_size);
// Copies |source| into a buffer that is allocated by this function and that
// can be freed with SbMemoryDeallocate. This function is meant to be a drop-in
// replacement for |strdup|.
//
// |source|: The string to be copied.
SB_EXPORT char* SbStringDuplicate(const char* source);
// Finds the first occurrence of a |character| in |str|. The return value is a
// pointer to the found character in the given string or |NULL| if the
// character is not found. Note that this function's signature does NOT match
// that of the |strchr| function.
//
// |str|: The string to search for the character.
// |character|: The character to find in the string.
SB_EXPORT const char* SbStringFindCharacter(const char* str, char character);
// Finds the last occurrence of a specified character in a string.
// The return value is a pointer to the found character in the given string or
// |NULL| if the character is not found. Note that this function's signature
// does NOT match that of the |strrchr| function.
//
// |str|: The string to search for the character.
// |character|: The character to find in the string.
SB_EXPORT const char* SbStringFindLastCharacter(const char* str,
char character);
// Finds the first occurrence of |str2| in |str1|. The return value is a
// pointer to the beginning of the found string or |NULL| if the string is
// not found. This function is meant to be a drop-in replacement for |strstr|.
//
// |str1|: The string in which to search for the presence of |str2|.
// |str2|: The string to locate in |str1|.
SB_EXPORT const char* SbStringFindString(const char* str1, const char* str2);
// Compares two strings, ignoring differences in case. The return value is:
// - |< 0| if |string1| is ASCII-betically lower than |string2|.
// - |0| if the two strings are equal.
// - |> 0| if |string1| is ASCII-betically higher than |string2|.
//
// This function is meant to be a drop-in replacement for |strcasecmp|.
//
// |string1|: The first string to compare.
// |string2|: The second string to compare.
SB_EXPORT int SbStringCompareNoCase(const char* string1, const char* string2);
// Compares the first |count| characters of two strings, ignoring differences
// in case. The return value is:
// - |< 0| if |string1| is ASCII-betically lower than |string2|.
// - |0| if the two strings are equal.
// - |> 0| if |string1| is ASCII-betically higher than |string2|.
//
// This function is meant to be a drop-in replacement for |strncasecmp|.
//
// |string1|: The first string to compare.
// |string2|: The second string to compare.
// |count|: The number of characters to compare.
SB_EXPORT int SbStringCompareNoCaseN(const char* string1,
const char* string2,
size_t count);
// Produces a string formatted with |format| and |arguments|, placing as much
// of the result that will fit into |out_buffer|. The return value specifies
// the number of characters that the format would produce if |buffer_size| were
// infinite.
//
// This function is meant to be a drop-in replacement for |vsnprintf|.
//
// |out_buffer|: The location where the formatted string is stored.
// |buffer_size|: The size of |out_buffer|.
// |format|: A string that specifies how the data should be formatted.
// |arguments|: Variable arguments used in the string.
SB_EXPORT int SbStringFormat(char* out_buffer,
size_t buffer_size,
const char* format,
va_list arguments) SB_PRINTF_FORMAT(3, 0);
// An inline wrapper of SbStringFormat that converts from ellipsis to va_args.
// This function is meant to be a drop-in replacement for |snprintf|.
//
// |out_buffer|: The location where the formatted string is stored.
// |buffer_size|: The size of |out_buffer|.
// |format|: A string that specifies how the data should be formatted.
// |...|: Arguments used in the string.
static SB_C_INLINE int SbStringFormatF(char* out_buffer,
size_t buffer_size,
const char* format,
...) SB_PRINTF_FORMAT(3, 4);
static SB_C_INLINE int SbStringFormatF(char* out_buffer,
size_t buffer_size,
const char* format,
...) {
va_list arguments;
va_start(arguments, format);
int result = SbStringFormat(out_buffer, buffer_size, format, arguments);
va_end(arguments);
return result;
}
// An inline wrapper of SbStringFormat that is meant to be a drop-in
// replacement for the unsafe but commonly used |sprintf|.
//
// |out_buffer|: The location where the formatted string is stored.
// |format|: A string that specifies how the data should be formatted.
// |...|: Arguments used in the string.
static SB_C_INLINE int SbStringFormatUnsafeF(char* out_buffer,
const char* format,
...) SB_PRINTF_FORMAT(2, 3);
static SB_C_INLINE int SbStringFormatUnsafeF(char* out_buffer,
const char* format,
...) {
va_list arguments;
va_start(arguments, format);
int result = SbStringFormat(out_buffer, UINT_MAX, format, arguments);
va_end(arguments);
return result;
}
// This function is identical to SbStringFormat, but is for wide characters.
// It is meant to be a drop-in replacement for |vswprintf|.
//
// |out_buffer|: The location where the formatted string is stored.
// |buffer_size|: The size of |out_buffer|.
// |format|: A string that specifies how the data should be formatted.
// |arguments|: Variable arguments used in the string.
SB_EXPORT int SbStringFormatWide(wchar_t* out_buffer,
size_t buffer_size,
const wchar_t* format,
va_list arguments);
// An inline wrapper of SbStringFormatWide that converts from ellipsis to
// |va_args|.
//
// |out_buffer|: The location where the formatted string is stored.
// |buffer_size|: The size of |out_buffer|.
// |format|: A string that specifies how the data should be formatted.
// |...|: Arguments used in the string.
static SB_C_INLINE int SbStringFormatWideF(wchar_t* out_buffer,
size_t buffer_size,
const wchar_t* format,
...) {
va_list arguments;
va_start(arguments, format);
int result = SbStringFormatWide(out_buffer, buffer_size, format, arguments);
va_end(arguments);
return result;
}
// Compares the first |count| characters of two 16-bit character strings.
// The return value is:
// - |< 0| if |string1| is ASCII-betically lower than |string2|.
// - |0| if the two strings are equal.
// - |> 0| if |string1| is ASCII-betically higher than |string2|.
//
// This function is meant to be a drop-in replacement for |wcsncmp|.
//
// |string1|: The first 16-bit character string to compare.weird
// |string2|: The second 16-bit character string to compare.
// |count|: The number of characters to compare.
SB_EXPORT int SbStringCompareWide(const wchar_t* string1,
const wchar_t* string2,
size_t count);
// Compares the first |count| characters of two 8-bit character strings.
// The return value is:
// - |< 0| if |string1| is ASCII-betically lower than |string2|.
// - |0| if the two strings are equal.
// - |> 0| if |string1| is ASCII-betically higher than |string2|.
//
// This function is meant to be a drop-in replacement for |strncmp|.
//
// |string1|: The first 8-bit character string to compare.
// |string2|: The second 8-bit character string to compare.
// |count|: The number of characters to compare.
SB_EXPORT int SbStringCompare(const char* string1,
const char* string2,
size_t count);
// Compares two entire 8-bit character strings. The return value is:
// - |< 0| if |string1| is ASCII-betically lower than |string2|.
// - |0| if the two strings are equal.
// - |> 0| if |string1| is ASCII-betically higher than |string2|.
//
// This function is meant to be a drop-in replacement for |strcmp|.
//
// |string1|: The first 8-bit character string to compare.
// |string2|: The second 8-bit character string to compare.
SB_EXPORT int SbStringCompareAll(const char* string1, const char* string2);
// Scans |buffer| for |pattern|, placing the extracted values in |arguments|.
// The return value specifies the number of successfully matched items, which
// may be |0|.
//
// This function is meant to be a drop-in replacement for |vsscanf|.
//
// |buffer|: The string to scan for the pattern.
// |pattern|: The string to search for in |buffer|.
// |arguments|: Values matching |pattern| that were extracted from |buffer|.
SB_EXPORT int SbStringScan(const char* buffer,
const char* pattern,
va_list arguments);
// An inline wrapper of SbStringScan that converts from ellipsis to |va_args|.
// This function is meant to be a drop-in replacement for |sscanf|.
// |buffer|: The string to scan for the pattern.
// |pattern|: The string to search for in |buffer|.
// |...|: Values matching |pattern| that were extracted from |buffer|.
static SB_C_INLINE int SbStringScanF(const char* buffer,
const char* pattern,
...) {
va_list arguments;
va_start(arguments, pattern);
int result = SbStringScan(buffer, pattern, arguments);
va_end(arguments);
return result;
}
// Extracts a string that represents an integer from the beginning of |start|
// into a signed integer in the given |base|. This function is meant to be a
// drop-in replacement for |strtol|.
//
// |start|: The string that begins with the number to be converted.
// |out_end|: If provided, the function places a pointer to the end of the
// consumed portion of the string into |out_end|.
// |base|: The base into which the number will be converted. The value must
// be between |2| and |36|, inclusive.
// NOLINTNEXTLINE(runtime/int)
SB_EXPORT long SbStringParseSignedInteger(const char* start,
char** out_end,
int base);
// Parses a string into a base-10 integer. This is a shorthand replacement for
// |atoi|.
//
// |value|: The string to be converted.
static SB_C_INLINE int SbStringAToI(const char* value) {
// NOLINTNEXTLINE(readability/casting)
return (int)SbStringParseSignedInteger(value, NULL, 10);
}
// Parses a string into a base-10, long integer. This is a shorthand
// replacement for |atol|.
//
// |value|: The string to be converted.
// NOLINTNEXTLINE(runtime/int)
static SB_C_INLINE long SbStringAToL(const char* value) {
// NOLINTNEXTLINE(readability/casting)
return SbStringParseSignedInteger(value, NULL, 10);
}
// Extracts a string that represents an integer from the beginning of |start|
// into an unsigned integer in the given |base|.
// This function is meant to be a drop-in replacement for |strtoul|.
//
// |start|: The string that begins with the number to be converted.
// |out_end|: If provided, the function places a pointer to the end of the
// consumed portion of the string into |out_end|.
// |base|: The base into which the number will be converted. The value must
// be between |2| and |36|, inclusive.
// NOLINTNEXTLINE(runtime/int)
SB_EXPORT unsigned long SbStringParseUnsignedInteger(const char* start,
char** out_end,
int base);
// Extracts a string that represents an integer from the beginning of |start|
// into an unsigned 64-bit integer in the given |base|.
//
// This function is meant to be a drop-in replacement for |strtoull|, except
// that it is explicitly declared to return |uint64_t|.
//
// |start|: The string that begins with the number to be converted.
// |out_end|: If provided, the function places a pointer to the end of the
// consumed portion of the string into |out_end|.
// |base|: The base into which the number will be converted. The value must
// be between |2| and |36|, inclusive.
SB_EXPORT uint64_t SbStringParseUInt64(const char* start,
char** out_end,
int base);
// Extracts a string that represents an integer from the beginning of |start|
// into a double.
//
// This function is meant to be a drop-in replacement for |strtod|, except
// that it is explicitly declared to return a double.
//
// |start|: The string that begins with the number to be converted.
// |out_end|: If provided, the function places a pointer to the end of the
// consumed portion of the string into |out_end|.
SB_EXPORT double SbStringParseDouble(const char* start, char** out_end);
#ifdef __cplusplus
} // extern "C"
#endif
#ifdef __cplusplus
extern "C++" {
#include <string>
#include <vector>
namespace starboard {
SB_EXPORT SB_C_INLINE std::string FormatString(const char* format, ...)
SB_PRINTF_FORMAT(1, 2);
SB_EXPORT SB_C_INLINE std::string FormatString(const char* format, ...) {
va_list arguments;
va_start(arguments, format);
int expected_size = ::SbStringFormat(NULL, 0, format, arguments);
va_end(arguments);
std::string result;
if (expected_size <= 0) {
return result;
}
std::vector<char> buffer(expected_size + 1);
va_start(arguments, format);
::SbStringFormat(buffer.data(), buffer.size(), format, arguments);
va_end(arguments);
return std::string(buffer.data(), expected_size);
}
} // namespace starboard
} // extern "C++"
#endif // __cplusplus
#endif // STARBOARD_STRING_H_