xref: /unit/src/nxt_utf8.h (revision 611:323e11065f83)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
70Sigor@sysoev.ru #ifndef _NXT_UTF8_H_INCLUDED_
80Sigor@sysoev.ru #define _NXT_UTF8_H_INCLUDED_
90Sigor@sysoev.ru 
100Sigor@sysoev.ru 
110Sigor@sysoev.ru /*
12*611Svbart@nginx.com  * Since the maximum valid Unicode character is 0x0010FFFF, the maximum
13*611Svbart@nginx.com  * difference between Unicode characters is lesser 0x0010FFFF and
14*611Svbart@nginx.com  * 0x0EEE0EEE can be used as value to indicate UTF-8 encoding error.
150Sigor@sysoev.ru  */
16*611Svbart@nginx.com #define NXT_UTF8_SORT_INVALID  0x0EEE0EEE
170Sigor@sysoev.ru 
180Sigor@sysoev.ru 
190Sigor@sysoev.ru NXT_EXPORT u_char *nxt_utf8_encode(u_char *p, uint32_t u);
200Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_utf8_decode(const u_char **start, const u_char *end);
210Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_utf8_decode2(const u_char **start, const u_char *end);
220Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_utf8_casecmp(const u_char *start1,
230Sigor@sysoev.ru     const u_char *start2, size_t len1, size_t len2);
240Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_utf8_lowcase(const u_char **start, const u_char *end);
250Sigor@sysoev.ru NXT_EXPORT ssize_t nxt_utf8_length(const u_char *p, size_t len);
260Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_utf8_is_valid(const u_char *p, size_t len);
270Sigor@sysoev.ru 
280Sigor@sysoev.ru 
290Sigor@sysoev.ru /* nxt_utf8_next() expects a valid UTF-8 string. */
300Sigor@sysoev.ru 
310Sigor@sysoev.ru nxt_inline const u_char *
nxt_utf8_next(const u_char * p,const u_char * end)320Sigor@sysoev.ru nxt_utf8_next(const u_char *p, const u_char *end)
330Sigor@sysoev.ru {
340Sigor@sysoev.ru     u_char  c;
350Sigor@sysoev.ru 
360Sigor@sysoev.ru     c = *p++;
370Sigor@sysoev.ru 
380Sigor@sysoev.ru     if ((c & 0x80) != 0) {
390Sigor@sysoev.ru 
400Sigor@sysoev.ru         do {
410Sigor@sysoev.ru             /*
420Sigor@sysoev.ru              * The first UTF-8 byte is either 0xxxxxxx or 11xxxxxx.
430Sigor@sysoev.ru              * The next UTF-8 bytes are 10xxxxxx.
440Sigor@sysoev.ru              */
450Sigor@sysoev.ru             c = *p;
460Sigor@sysoev.ru 
47*611Svbart@nginx.com             if ((c & 0xC0) != 0x80) {
480Sigor@sysoev.ru                 return p;
490Sigor@sysoev.ru             }
500Sigor@sysoev.ru 
510Sigor@sysoev.ru             p++;
520Sigor@sysoev.ru 
530Sigor@sysoev.ru         } while (p < end);
540Sigor@sysoev.ru     }
550Sigor@sysoev.ru 
560Sigor@sysoev.ru     return p;
570Sigor@sysoev.ru }
580Sigor@sysoev.ru 
590Sigor@sysoev.ru 
600Sigor@sysoev.ru #endif /* _NXT_UTF8_H_INCLUDED_ */
61