Files
MapLibreParticleLab/vendor/nunicode/include/libnu/strings.h

143 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef NU_STRINGS_H
#define NU_STRINGS_H
/** @defgroup strings String functions
*
* Note on "n" functions variant: "n" is in bytes in all functions,
* note though that those are not for memory overrun control.
* They are just for strings not having terminating 0 byte and those
* functions won't go further than m-th *codepoint* in string, but might go
* further than n-th byte in case of multibyte sequence.
*
* E.g.: ``nu_strnlen("абв", 3, nu_utf8_read);``.
* Since codepoints are 2-byte sequences, nu_strnlen() won't go further than 2nd
* codepoint, but will go further than 3rd byte while reading "б".
*/
#include <stdint.h>
#include <sys/types.h>
#include <libnu/config.h>
#include <libnu/defines.h>
#if defined (__cplusplus) || defined (c_plusplus)
extern "C" {
#endif
/**
* @defgroup iterators Iterators
* @defgroup transformations Codepoint transformations
* @defgroup transformations_internal Codepoint transformations (internal)
*/
/** Read (decode) iterator
*
* @ingroup iterators
* @see nu_utf8_read
*/
typedef const char* (*nu_read_iterator_t)(const char *encoded, uint32_t *unicode);
/** Read (decode) backwards iterator
*
* Arguments intentionally reversed to not mix this with nu_read_iterator_t.
* Reverse read is not compatible with any of string functions.
*
* @ingroup iterators
* @see nu_utf8_revread
*/
typedef const char* (*nu_revread_iterator_t)(uint32_t *unicode, const char *encoded);
/** Write (encode) iterator
*
* @ingroup iterators
* @see nu_utf8_write
*/
typedef char* (*nu_write_iterator_t)(uint32_t unicode, char *encoded);
/** Transform codepoint
*
* @ingroup transformations
* @see nu_toupper
* @see nu_tolower
*/
typedef const char* (*nu_transformation_t)(uint32_t codepoint);
/** Transform codepoint (used internally). This kind of transformation
* delegates iteration on string to transformation implementation.
*
* @ingroup transformations_internal
* @see _nu_toupper
* @see _nu_tolower
*/
typedef const char* (*nu_transform_read_t)(
const char *encoded, const char *limit, nu_read_iterator_t read,
uint32_t *u, const char **transformed,
void *context);
#if (defined NU_WITH_Z_STRINGS) || (defined NU_WITH_N_STRINGS)
#endif /* NU_WITH_Z_STRINGS NU_WITH_N_STRINGS */
#ifdef NU_WITH_Z_STRINGS
/** Get decoded string codepoints length
*
* @ingroup strings
* @param encoded encoded string
* @param it decoding function
* @return string length or negative error
*
* @see nu_strnlen
*/
NU_EXPORT
ssize_t nu_strlen(const char *encoded, nu_read_iterator_t it);
/** Get encoded string bytes length (encoding variant)
*
* @ingroup strings
* @param unicode unicode codepoints
* @param it encoding function
* @return byte length or negative error
*
* @see nu_bytenlen
*/
NU_EXPORT
ssize_t nu_bytelen(const uint32_t *unicode, nu_write_iterator_t it);
/** Get encoded string bytes length
*
* @ingroup strings
* @param encoded encoded string
* @param it decoding function
* @return string length or negative error
*/
NU_EXPORT
ssize_t nu_strbytelen(const char *encoded, nu_read_iterator_t it);
#endif /* NU_WITH_Z_STRINGS */
#ifdef NU_WITH_N_STRINGS
/**
* @ingroup strings
* @see nu_strlen
*/
NU_EXPORT
ssize_t nu_strnlen(const char *encoded, size_t max_len, nu_read_iterator_t it);
/**
* @ingroup strings
* @see nu_bytelen
*/
NU_EXPORT
ssize_t nu_bytenlen(const uint32_t *unicode, size_t max_len,
nu_write_iterator_t it);
#endif /* NU_WITH_N_STRINGS */
#if defined (__cplusplus) || defined (c_plusplus)
}
#endif
#endif /* NU_STRINGS_H */