summaryrefslogtreecommitdiff
path: root/include/lexer/char_info.h
blob: 4f2e3985e2fade16f35abfd8fdc7b58c9c0540e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * Copyright (c) 2025 Quinn Stephens and the OSMORA team.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holder nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS”
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _LEXER_CHAR_INFO_H
#define _LEXER_CHAR_INFO_H 1

#include <stdint.h>
#include "lexer/token.h"

#define CHAR_HORZ_WS (1 << 0)
#define CHAR_VERT_WS (1 << 1)
#define CHAR_DIGIT   (1 << 2)
#define CHAR_XDIGIT  (1 << 3)
#define CHAR_UPPER   (1 << 4)
#define CHAR_LOWER   (1 << 5)
#define CHAR_SINGLE  (1 << 6)

#define CHAR_HEX        (CHAR_DIGIT   | CHAR_XDIGIT)
#define CHAR_XUPPER     (CHAR_XDIGIT  | CHAR_UPPER)
#define CHAR_XLOWER     (CHAR_XDIGIT  | CHAR_LOWER)
#define CHAR_WHITESPACE (CHAR_HORZ_WS | CHAR_VERT_WS)
#define CHAR_ALPHA      (CHAR_UPPER   | CHAR_LOWER)
#define CHAR_ALNUM      (CHAR_ALPHA   | CHAR_DIGIT)

#define CHAR_SINGLE_SHIFT 8
#define MAKE_SINGLE(type) ((type << CHAR_SINGLE_SHIFT) | CHAR_SINGLE)
#define CHAR_COMMA   MAKE_SINGLE(TOK_COMMA)
#define CHAR_DOT     MAKE_SINGLE(TOK_DOT)
#define CHAR_COLON   MAKE_SINGLE(TOK_COLON)
#define CHAR_SEMI    MAKE_SINGLE(TOK_SEMICOLON)
#define CHAR_LPAREN  MAKE_SINGLE(TOK_LPAREN)
#define CHAR_RPAREN  MAKE_SINGLE(TOK_RPAREN)
#define CHAR_LCURLY  MAKE_SINGLE(TOK_LCURLY)
#define CHAR_RCURLY  MAKE_SINGLE(TOK_RCURLY)
#define CHAR_LSQUARE MAKE_SINGLE(TOK_LSQUARE)
#define CHAR_RSQUARE MAKE_SINGLE(TOK_RSQUARE)
#define CHAR_ASTER   MAKE_SINGLE(TOK_ASTERISK)

#define CHAR_INFO_COUNT 256

extern uint16_t char_info[CHAR_INFO_COUNT];

#endif /* !_LEXER_CHAR_INFO_H */