xref: /unit/src/nxt_utf8.h (revision 0)
1*0Sigor@sysoev.ru 
2*0Sigor@sysoev.ru /*
3*0Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4*0Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5*0Sigor@sysoev.ru  */
6*0Sigor@sysoev.ru 
7*0Sigor@sysoev.ru #ifndef _NXT_UTF8_H_INCLUDED_
8*0Sigor@sysoev.ru #define _NXT_UTF8_H_INCLUDED_
9*0Sigor@sysoev.ru 
10*0Sigor@sysoev.ru 
11*0Sigor@sysoev.ru /*
12*0Sigor@sysoev.ru  * Since the maximum valid Unicode character is 0x0010ffff, the maximum
13*0Sigor@sysoev.ru  * difference between Unicode characters is lesser 0x0010ffff and
14*0Sigor@sysoev.ru  * 0x0eee0eee can be used as value to indicate UTF-8 encoding error.
15*0Sigor@sysoev.ru  */
16*0Sigor@sysoev.ru #define NXT_UTF8_SORT_INVALID  0x0eee0eee
17*0Sigor@sysoev.ru 
18*0Sigor@sysoev.ru 
19*0Sigor@sysoev.ru NXT_EXPORT u_char *nxt_utf8_encode(u_char *p, uint32_t u);
20*0Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_utf8_decode(const u_char **start, const u_char *end);
21*0Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_utf8_decode2(const u_char **start, const u_char *end);
22*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_utf8_casecmp(const u_char *start1,
23*0Sigor@sysoev.ru     const u_char *start2, size_t len1, size_t len2);
24*0Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_utf8_lowcase(const u_char **start, const u_char *end);
25*0Sigor@sysoev.ru NXT_EXPORT ssize_t nxt_utf8_length(const u_char *p, size_t len);
26*0Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_utf8_is_valid(const u_char *p, size_t len);
27*0Sigor@sysoev.ru 
28*0Sigor@sysoev.ru 
29*0Sigor@sysoev.ru /* nxt_utf8_next() expects a valid UTF-8 string. */
30*0Sigor@sysoev.ru 
31*0Sigor@sysoev.ru nxt_inline const u_char *
32*0Sigor@sysoev.ru nxt_utf8_next(const u_char *p, const u_char *end)
33*0Sigor@sysoev.ru {
34*0Sigor@sysoev.ru     u_char  c;
35*0Sigor@sysoev.ru 
36*0Sigor@sysoev.ru     c = *p++;
37*0Sigor@sysoev.ru 
38*0Sigor@sysoev.ru     if ((c & 0x80) != 0) {
39*0Sigor@sysoev.ru 
40*0Sigor@sysoev.ru         do {
41*0Sigor@sysoev.ru             /*
42*0Sigor@sysoev.ru              * The first UTF-8 byte is either 0xxxxxxx or 11xxxxxx.
43*0Sigor@sysoev.ru              * The next UTF-8 bytes are 10xxxxxx.
44*0Sigor@sysoev.ru              */
45*0Sigor@sysoev.ru             c = *p;
46*0Sigor@sysoev.ru 
47*0Sigor@sysoev.ru             if ((c & 0xc0) != 0x80) {
48*0Sigor@sysoev.ru                 return p;
49*0Sigor@sysoev.ru             }
50*0Sigor@sysoev.ru 
51*0Sigor@sysoev.ru             p++;
52*0Sigor@sysoev.ru 
53*0Sigor@sysoev.ru         } while (p < end);
54*0Sigor@sysoev.ru     }
55*0Sigor@sysoev.ru 
56*0Sigor@sysoev.ru     return p;
57*0Sigor@sysoev.ru }
58*0Sigor@sysoev.ru 
59*0Sigor@sysoev.ru 
60*0Sigor@sysoev.ru #endif /* _NXT_UTF8_H_INCLUDED_ */
61