summaryrefslogtreecommitdiff
path: root/vendor/nunicode/include/libnu/strings.h
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/nunicode/include/libnu/strings.h')
-rw-r--r--vendor/nunicode/include/libnu/strings.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/vendor/nunicode/include/libnu/strings.h b/vendor/nunicode/include/libnu/strings.h
new file mode 100644
index 0000000000..989ef5ba3f
--- /dev/null
+++ b/vendor/nunicode/include/libnu/strings.h
@@ -0,0 +1,142 @@
+#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 */