1 #ifndef NU_STRCOLL_H
2 #define NU_STRCOLL_H
3 
4 /** @defgroup collation Collation functions
5  *
6  * All functions in this group are following full Unicode collation rules,
7  * i.e. nu_strstr(haystack, "Æ") will find "AE" in haystack and
8  * nu_strstr(haystack, "ß") will find "ss".
9  *
10  * Same applies for *every* function, nu_strchr(str, 0x00DF), as you would
11  * guess, will also find "ss" in str.
12  *
13  * Please expect this.
14  *
15  * Note on "n" functions variant: please see comment on this topic
16  * in strings.h
17  */
18 
19 #include <sys/types.h>
20 
21 #include <libnu/config.h>
22 #include <libnu/casemap.h>
23 #include <libnu/defines.h>
24 #include <libnu/strings.h>
25 
26 #if defined (__cplusplus) || defined (c_plusplus)
27 extern "C" {
28 #endif
29 
30 #ifdef NU_WITH_TOFOLD
31 # define NU_FOLDING_FUNCTION nu_tofold
32 #else
33 # define NU_FOLDING_FUNCTION nu_toupper
34 #endif /* NU_WITH_TOFOLD */
35 
36 #ifdef NU_WITH_Z_COLLATION
37 
38 /** Locate codepoint in string
39  *
40  * @ingroup collation
41  * @param encoded encoded string
42  * @param c charater  to locate
43  * @param read read (decode) function for encoded string
44  * @return pointer to codepoint in string or 0
45  */
46 NU_EXPORT
47 const char* nu_strchr(const char *encoded, uint32_t c, nu_read_iterator_t read);
48 
49 /** Locate codepoint in string ignoring case
50  *
51  * @ingroup collation
52  * @see nu_strchr
53  */
54 NU_EXPORT
55 const char* nu_strcasechr(const char *encoded, uint32_t c, nu_read_iterator_t read);
56 
57 /** Locate codepoint in string in reverse direction
58  *
59  * @ingroup collation
60  * @param encoded encoded string
61  * @param c charater  to locate
62  * @param read read (decode) function for encoded string
63  * @return pointer to codepoint in string or 0
64  */
65 NU_EXPORT
66 const char* nu_strrchr(const char *encoded, uint32_t c, nu_read_iterator_t read);
67 
68 /** Locate codepoint in string in reverse direction, case-insensitive
69  *
70  * @ingroup collation
71  * @see nu_strrchr
72  */
73 NU_EXPORT
74 const char* nu_strrcasechr(const char *encoded, uint32_t c, nu_read_iterator_t read);
75 
76 /** Compare strings in case-sensitive manner.
77  *
78  * @ingroup collation
79  * @param s1 first encoded strings
80  * @param s2 second encoded strings
81  * @param s1_read read (decode) function for first string
82  * @param s2_read read (decode) function for second string
83  * @return -1, 0, 1
84  */
85 NU_EXPORT
86 int nu_strcoll(const char *s1, const char *s2,
87 	nu_read_iterator_t s1_read, nu_read_iterator_t s2_read);
88 
89 /** Compare strings in case-insensitive manner.
90  *
91  * @ingroup collation
92  * @see nu_strcoll
93  */
94 NU_EXPORT
95 int nu_strcasecoll(const char *s1, const char *s2,
96 	nu_read_iterator_t s1_read, nu_read_iterator_t s2_read);
97 
98 /** Find needle in haystack
99  *
100  * @ingroup collation
101  * @param haystack encoded haystack
102  * @param needle encoded needle
103  * @param haystack_read haystack read (decode) function
104  * @param needle_read needle read (decode) function
105  * @return pointer to found string or 0, will return
106  * haystack if needle is empty string
107  */
108 NU_EXPORT
109 const char* nu_strstr(const char *haystack, const char *needle,
110 	nu_read_iterator_t haystack_read, nu_read_iterator_t needle_read);
111 
112 /** Find needle in haystack (case-insensitive)
113  *
114  * @ingroup collation
115  * @see nu_strstr
116  */
117 NU_EXPORT
118 const char* nu_strcasestr(const char *haystack, const char *needle,
119 	nu_read_iterator_t haystack_read, nu_read_iterator_t needle_read);
120 
121 #endif /* NU_WITH_Z_COLLATION */
122 
123 #ifdef NU_WITH_N_COLLATION
124 
125 /**
126  * @ingroup collation
127  * @see nu_strchr
128  */
129 NU_EXPORT
130 const char* nu_strnchr(const char *encoded, size_t max_len, uint32_t c,
131 	nu_read_iterator_t read);
132 
133 /**
134  * @ingroup collation
135  * @see nu_strcasechr
136  */
137 NU_EXPORT
138 const char* nu_strcasenchr(const char *encoded, size_t max_len, uint32_t c,
139 	nu_read_iterator_t read);
140 
141 /**
142  * @ingroup collation
143  * @see nu_strrchr
144  */
145 NU_EXPORT
146 const char* nu_strrnchr(const char *encoded, size_t max_len, uint32_t c,
147 	nu_read_iterator_t read);
148 
149 /**
150  * @ingroup collation
151  * @see nu_strrcasechr
152  */
153 NU_EXPORT
154 const char* nu_strrcasenchr(const char *encoded, size_t max_len, uint32_t c,
155 	nu_read_iterator_t read);
156 
157 /**
158  * @ingroup collation
159  * @see nu_strcoll
160  */
161 NU_EXPORT
162 int nu_strncoll(const char *s1, size_t s1_max_len,
163 	const char *s2, size_t s2_max_len,
164 	nu_read_iterator_t s1_read, nu_read_iterator_t s2_read);
165 
166 /**
167  * @ingroup collation
168  * @see nu_strncoll
169  */
170 NU_EXPORT
171 int nu_strcasencoll(const char *s1, size_t s1_max_len,
172 	const char *s2, size_t s2_max_len,
173 	nu_read_iterator_t s1_read, nu_read_iterator_t s2_read);
174 
175 /**
176  * @ingroup collation
177  * @see nu_strstr
178  */
179 NU_EXPORT
180 const char* nu_strnstr(const char *haystack, size_t haystack_max_len,
181 	const char *needle, size_t needle_max_len,
182 	nu_read_iterator_t haystack_read, nu_read_iterator_t needle_read);
183 
184 /**
185  * @ingroup collation
186  * @see nu_strcasestr
187  */
188 NU_EXPORT
189 const char* nu_strcasenstr(const char *haystack, size_t haystack_max_len,
190 	const char *needle, size_t needle_max_len,
191 	nu_read_iterator_t haystack_read, nu_read_iterator_t needle_read);
192 
193 #endif /* NU_WITH_N_COLLATION */
194 
195 #if defined (__cplusplus) || defined (c_plusplus)
196 }
197 #endif
198 
199 #endif /* NU_STRCOLL_H */
200