1 #ifndef NU_STRINGS_H
2 #define NU_STRINGS_H
3 
4 /** @defgroup strings String functions
5  *
6  * Note on "n" functions variant: "n" is in bytes in all functions,
7  * note though that those are not for memory overrun control.
8  * They are just for strings not having terminating 0 byte and those
9  * functions won't go further than m-th *codepoint* in string, but might go
10  * further than n-th byte in case of multibyte sequence.
11  *
12  * E.g.: ``nu_strnlen("абв", 3, nu_utf8_read);``.
13  * Since codepoints are 2-byte sequences, nu_strnlen() won't go further than 2nd
14  * codepoint, but will go further than 3rd byte while reading "б".
15  */
16 
17 #include <stdint.h>
18 #include <sys/types.h>
19 
20 #include <libnu/config.h>
21 #include <libnu/defines.h>
22 
23 #if defined (__cplusplus) || defined (c_plusplus)
24 extern "C" {
25 #endif
26 
27 /**
28  * @defgroup iterators Iterators
29  * @defgroup transformations Codepoint transformations
30  * @defgroup transformations_internal Codepoint transformations (internal)
31  */
32 
33 /** Read (decode) iterator
34  *
35  * @ingroup iterators
36  * @see nu_utf8_read
37  */
38 typedef const char* (*nu_read_iterator_t)(const char *encoded, uint32_t *unicode);
39 
40 /** Read (decode) backwards iterator
41  *
42  * Arguments intentionally reversed to not mix this with nu_read_iterator_t.
43  * Reverse read is not compatible with any of string functions.
44  *
45  * @ingroup iterators
46  * @see nu_utf8_revread
47  */
48 typedef const char* (*nu_revread_iterator_t)(uint32_t *unicode, const char *encoded);
49 
50 /** Write (encode) iterator
51  *
52  * @ingroup iterators
53  * @see nu_utf8_write
54  */
55 typedef char* (*nu_write_iterator_t)(uint32_t unicode, char *encoded);
56 
57 /** Transform codepoint
58  *
59  * @ingroup transformations
60  * @see nu_toupper
61  * @see nu_tolower
62  */
63 typedef const char* (*nu_transformation_t)(uint32_t codepoint);
64 
65 /** Transform codepoint (used internally). This kind of transformation
66  * delegates iteration on string to transformation implementation.
67  *
68  * @ingroup transformations_internal
69  * @see _nu_toupper
70  * @see _nu_tolower
71  */
72 typedef const char* (*nu_transform_read_t)(
73 	const char *encoded, const char *limit, nu_read_iterator_t read,
74 	uint32_t *u, const char **transformed,
75 	void *context);
76 
77 #if (defined NU_WITH_Z_STRINGS) || (defined NU_WITH_N_STRINGS)
78 
79 #endif /* NU_WITH_Z_STRINGS NU_WITH_N_STRINGS */
80 
81 #ifdef NU_WITH_Z_STRINGS
82 
83 /** Get decoded string codepoints length
84  *
85  * @ingroup strings
86  * @param encoded encoded string
87  * @param it decoding function
88  * @return string length or negative error
89  *
90  * @see nu_strnlen
91  */
92 NU_EXPORT
93 ssize_t nu_strlen(const char *encoded, nu_read_iterator_t it);
94 
95 /** Get encoded string bytes length (encoding variant)
96  *
97  * @ingroup strings
98  * @param unicode unicode codepoints
99  * @param it encoding function
100  * @return byte length or negative error
101  *
102  * @see nu_bytenlen
103  */
104 NU_EXPORT
105 ssize_t nu_bytelen(const uint32_t *unicode, nu_write_iterator_t it);
106 
107 /** Get encoded string bytes length
108  *
109  * @ingroup strings
110  * @param encoded encoded string
111  * @param it decoding function
112  * @return string length or negative error
113  */
114 NU_EXPORT
115 ssize_t nu_strbytelen(const char *encoded, nu_read_iterator_t it);
116 
117 #endif /* NU_WITH_Z_STRINGS */
118 
119 #ifdef NU_WITH_N_STRINGS
120 
121 /**
122  * @ingroup strings
123  * @see nu_strlen
124  */
125 NU_EXPORT
126 ssize_t nu_strnlen(const char *encoded, size_t max_len, nu_read_iterator_t it);
127 
128 /**
129  * @ingroup strings
130  * @see nu_bytelen
131  */
132 NU_EXPORT
133 ssize_t nu_bytenlen(const uint32_t *unicode, size_t max_len,
134 	nu_write_iterator_t it);
135 
136 #endif /* NU_WITH_N_STRINGS */
137 
138 #if defined (__cplusplus) || defined (c_plusplus)
139 }
140 #endif
141 
142 #endif /* NU_STRINGS_H */
143