1 
2 /*
3  * Copyright (C) Alexander Borisov
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #ifndef _NJS_UNICODE_H_INCLUDED_
8 #define _NJS_UNICODE_H_INCLUDED_
9 
10 
11 enum {
12     NJS_UNICODE_BOM           = 0xFEFF,
13     NJS_UNICODE_REPLACEMENT   = 0xFFFD,
14     NJS_UNICODE_MAX_CODEPOINT = 0x10FFFF,
15     NJS_UNICODE_ERROR         = 0x1FFFFF,
16     NJS_UNICODE_CONTINUE      = 0x2FFFFF
17 };
18 
19 typedef struct {
20     uint32_t  codepoint;
21 
22     unsigned  need;
23     u_char    lower;
24     u_char    upper;
25 } njs_unicode_decode_t;
26 
27 #define njs_surrogate_leading(cp)                                             \
28     (((unsigned) (cp) - 0xd800) <= 0xdbff - 0xd800)
29 
30 #define njs_surrogate_trailing(cp)                                            \
31     (((unsigned) (cp) - 0xdc00) <= 0xdfff - 0xdc00)
32 
33 #define njs_surrogate_any(cp)                                                 \
34     (((unsigned) (cp) - 0xd800) <= 0xdfff - 0xd800)
35 
36 #define njs_surrogate_pair(high, low)                                         \
37     (0x10000 + (((high) - 0xd800) << 10) + ((low) - 0xdc00))
38 
39 
40 #endif /* _NJS_UNICODE_H_INCLUDED_ */
41