1#ifndef NVIM_ASCII_H
2#define NVIM_ASCII_H
3
4#include <stdbool.h>
5
6#include "nvim/macros.h"
7#include "nvim/func_attr.h"
8#include "nvim/os/os_defs.h"
9
10// Definitions of various common control characters.
11
12#define CharOrd(x) ((uint8_t)(x) < 'a' \
13 ? (uint8_t)(x) - 'A'\
14 : (uint8_t)(x) - 'a')
15#define CharOrdLow(x) ((uint8_t)(x) - 'a')
16#define CharOrdUp(x) ((uint8_t)(x) - 'A')
17#define ROT13(c, a) (((((c) - (a)) + 13) % 26) + (a))
18
19#define NUL '\000'
20#define BELL '\007'
21#define BS '\010'
22#define TAB '\011'
23#define NL '\012'
24#define NL_STR "\012"
25#define FF '\014'
26#define CAR '\015' /* CR is used by Mac OS X */
27#define ESC '\033'
28#define ESC_STR "\033"
29#define DEL 0x7f
30#define DEL_STR "\177"
31#define CSI 0x9b // Control Sequence Introducer
32#define CSI_STR "\233"
33#define DCS 0x90 /* Device Control String */
34#define STERM 0x9c /* String Terminator */
35
36#define POUND 0xA3
37
38#define Ctrl_chr(x) (TOUPPER_ASC(x) ^ 0x40) /* '?' -> DEL, '@' -> ^@, etc. */
39#define Meta(x) ((x) | 0x80)
40
41#define CTRL_F_STR "\006"
42#define CTRL_H_STR "\010"
43#define CTRL_V_STR "\026"
44
45#define Ctrl_AT 0 /* @ */
46#define Ctrl_A 1
47#define Ctrl_B 2
48#define Ctrl_C 3
49#define Ctrl_D 4
50#define Ctrl_E 5
51#define Ctrl_F 6
52#define Ctrl_G 7
53#define Ctrl_H 8
54#define Ctrl_I 9
55#define Ctrl_J 10
56#define Ctrl_K 11
57#define Ctrl_L 12
58#define Ctrl_M 13
59#define Ctrl_N 14
60#define Ctrl_O 15
61#define Ctrl_P 16
62#define Ctrl_Q 17
63#define Ctrl_R 18
64#define Ctrl_S 19
65#define Ctrl_T 20
66#define Ctrl_U 21
67#define Ctrl_V 22
68#define Ctrl_W 23
69#define Ctrl_X 24
70#define Ctrl_Y 25
71#define Ctrl_Z 26
72/* CTRL- [ Left Square Bracket == ESC*/
73#define Ctrl_BSL 28 /* \ BackSLash */
74#define Ctrl_RSB 29 /* ] Right Square Bracket */
75#define Ctrl_HAT 30 /* ^ */
76#define Ctrl__ 31
77
78
79/*
80 * Character that separates dir names in a path.
81 */
82#ifdef BACKSLASH_IN_FILENAME
83# define PATHSEP psepc
84# define PATHSEPSTR pseps
85#else
86# define PATHSEP '/'
87# define PATHSEPSTR "/"
88#endif
89
90static inline bool ascii_iswhite(int)
91 REAL_FATTR_CONST
92 REAL_FATTR_ALWAYS_INLINE;
93
94static inline bool ascii_isdigit(int)
95 REAL_FATTR_CONST
96 REAL_FATTR_ALWAYS_INLINE;
97
98static inline bool ascii_isxdigit(int)
99 REAL_FATTR_CONST
100 REAL_FATTR_ALWAYS_INLINE;
101
102static inline bool ascii_isident(int)
103 REAL_FATTR_CONST
104 REAL_FATTR_ALWAYS_INLINE;
105
106static inline bool ascii_isbdigit(int)
107 REAL_FATTR_CONST
108 REAL_FATTR_ALWAYS_INLINE;
109
110static inline bool ascii_isspace(int)
111 REAL_FATTR_CONST
112 REAL_FATTR_ALWAYS_INLINE;
113
114/// Checks if `c` is a space or tab character.
115///
116/// @see {ascii_isdigit}
117static inline bool ascii_iswhite(int c)
118{
119 return c == ' ' || c == '\t';
120}
121
122/// Check whether character is a decimal digit.
123///
124/// Library isdigit() function is officially locale-dependent and, for
125/// example, returns true for superscript 1 (¹) in locales where encoding
126/// contains it in lower 8 bits. Also avoids crashes in case c is below
127/// 0 or above 255: library functions are officially defined as accepting
128/// only EOF and unsigned char values (otherwise it is undefined behaviour)
129/// what may be used for some optimizations (e.g. simple `return
130/// isdigit_table[c];`).
131static inline bool ascii_isdigit(int c)
132{
133 return c >= '0' && c <= '9';
134}
135
136/// Checks if `c` is a hexadecimal digit, that is, one of 0-9, a-f, A-F.
137///
138/// @see {ascii_isdigit}
139static inline bool ascii_isxdigit(int c)
140{
141 return (c >= '0' && c <= '9')
142 || (c >= 'a' && c <= 'f')
143 || (c >= 'A' && c <= 'F');
144}
145
146/// Checks if `c` is an “identifier” character
147///
148/// That is, whether it is alphanumeric character or underscore.
149static inline bool ascii_isident(int c)
150{
151 return ASCII_ISALNUM(c) || c == '_';
152}
153
154/// Checks if `c` is a binary digit, that is, 0-1.
155///
156/// @see {ascii_isdigit}
157static inline bool ascii_isbdigit(int c)
158{
159 return (c == '0' || c == '1');
160}
161
162/// Checks if `c` is a white-space character, that is,
163/// one of \f, \n, \r, \t, \v.
164///
165/// @see {ascii_isdigit}
166static inline bool ascii_isspace(int c)
167{
168 return (c >= 9 && c <= 13) || c == ' ';
169}
170
171#endif /* NVIM_ASCII_H */
172