1 | #ifndef NVIM_MBYTE_H |
2 | #define NVIM_MBYTE_H |
3 | |
4 | #include <stdint.h> |
5 | #include <stdbool.h> |
6 | #include <string.h> |
7 | |
8 | #include "nvim/iconv.h" |
9 | #include "nvim/func_attr.h" |
10 | #include "nvim/os/os_defs.h" // For indirect |
11 | #include "nvim/types.h" // for char_u |
12 | |
13 | /* |
14 | * Return byte length of character that starts with byte "b". |
15 | * Returns 1 for a single-byte character. |
16 | * MB_BYTE2LEN_CHECK() can be used to count a special key as one byte. |
17 | * Don't call MB_BYTE2LEN(b) with b < 0 or b > 255! |
18 | */ |
19 | #define MB_BYTE2LEN(b) utf8len_tab[b] |
20 | #define MB_BYTE2LEN_CHECK(b) (((b) < 0 || (b) > 255) ? 1 : utf8len_tab[b]) |
21 | |
22 | // max length of an unicode char |
23 | #define MB_MAXCHAR 6 |
24 | |
25 | /* properties used in enc_canon_table[] (first three mutually exclusive) */ |
26 | #define ENC_8BIT 0x01 |
27 | #define ENC_DBCS 0x02 |
28 | #define ENC_UNICODE 0x04 |
29 | |
30 | #define ENC_ENDIAN_B 0x10 /* Unicode: Big endian */ |
31 | #define ENC_ENDIAN_L 0x20 /* Unicode: Little endian */ |
32 | |
33 | #define ENC_2BYTE 0x40 /* Unicode: UCS-2 */ |
34 | #define ENC_4BYTE 0x80 /* Unicode: UCS-4 */ |
35 | #define ENC_2WORD 0x100 /* Unicode: UTF-16 */ |
36 | |
37 | #define ENC_LATIN1 0x200 /* Latin1 */ |
38 | #define ENC_LATIN9 0x400 /* Latin9 */ |
39 | #define ENC_MACROMAN 0x800 /* Mac Roman (not Macro Man! :-) */ |
40 | |
41 | // TODO(bfredl): eventually we should keep only one of the namings |
42 | #define mb_ptr2len utfc_ptr2len |
43 | #define mb_char2len utf_char2len |
44 | #define mb_char2cells utf_char2cells |
45 | |
46 | /// Flags for vimconv_T |
47 | typedef enum { |
48 | CONV_NONE = 0, |
49 | CONV_TO_UTF8 = 1, |
50 | CONV_9_TO_UTF8 = 2, |
51 | CONV_TO_LATIN1 = 3, |
52 | CONV_TO_LATIN9 = 4, |
53 | CONV_ICONV = 5, |
54 | } ConvFlags; |
55 | |
56 | #define MBYTE_NONE_CONV { \ |
57 | .vc_type = CONV_NONE, \ |
58 | .vc_factor = 1, \ |
59 | .vc_fail = false, \ |
60 | } |
61 | |
62 | /// Structure used for string conversions |
63 | typedef struct { |
64 | int vc_type; ///< Zero or more ConvFlags. |
65 | int vc_factor; ///< Maximal expansion factor. |
66 | # ifdef HAVE_ICONV |
67 | iconv_t vc_fd; ///< Value for CONV_ICONV. |
68 | # endif |
69 | bool vc_fail; ///< What to do with invalid characters: if true, fail, |
70 | ///< otherwise use '?'. |
71 | } vimconv_T; |
72 | |
73 | extern const uint8_t utf8len_tab_zero[256]; |
74 | |
75 | extern const uint8_t utf8len_tab[256]; |
76 | |
77 | #ifdef INCLUDE_GENERATED_DECLARATIONS |
78 | # include "mbyte.h.generated.h" |
79 | #endif |
80 | |
81 | static inline int mb_strcmp_ic(bool ic, const char *s1, const char *s2) |
82 | REAL_FATTR_NONNULL_ALL REAL_FATTR_PURE REAL_FATTR_WARN_UNUSED_RESULT; |
83 | |
84 | /// Compare strings |
85 | /// |
86 | /// @param[in] ic True if case is to be ignored. |
87 | /// |
88 | /// @return 0 if s1 == s2, <0 if s1 < s2, >0 if s1 > s2. |
89 | static inline int mb_strcmp_ic(bool ic, const char *s1, const char *s2) |
90 | { |
91 | return (ic ? mb_stricmp(s1, s2) : strcmp(s1, s2)); |
92 | } |
93 | #endif // NVIM_MBYTE_H |
94 | |