diff options
author | Jo-Philipp Wich <jo@mein.io> | 2022-01-18 10:42:46 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2022-01-18 11:21:20 +0100 |
commit | 3578afee0ab77650cf6adf3987a6f653f9311e9b (patch) | |
tree | 4c57d279a8b54df10e6b194b586d3f6423d8e7cd /lexer.c | |
parent | 371ba457917cf319b74de5a56e17782f6c4cd77a (diff) |
build: support building without compile capabilities
Introduce a new default enable CMake option "COMPILE_SUPPORT" which
allows to disable source code compilation in the ucode interpreter.
Such an interpreter will only be able to load precompiled ucode files.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'lexer.c')
-rw-r--r-- | lexer.c | 112 |
1 files changed, 58 insertions, 54 deletions
@@ -54,6 +54,8 @@ struct token { (((x) >= 'a') ? (10 + (x) - 'a') : \ (((x) >= 'A') ? (10 + (x) - 'A') : dec(x))) +#ifndef NO_COMPILE + static uc_token_t *parse_comment(uc_lexer_t *); static uc_token_t *parse_string(uc_lexer_t *); static uc_token_t *parse_regexp(uc_lexer_t *); @@ -165,60 +167,6 @@ static const struct keyword reserved_words[] = { }; -/* - * Stores the given codepoint as a utf8 multibyte sequence into the given - * output buffer and substracts the required amount of bytes from the given - * length pointer. - * - * Returns false if the multibyte sequence would not fit into the buffer, - * otherwise true. - */ - -bool -utf8enc(char **out, int *rem, int code) -{ - if (code >= 0 && code <= 0x7F) { - if (*rem < 1) - return false; - - *(*out)++ = code; (*rem)--; - - return true; - } - else if (code > 0 && code <= 0x7FF) { - if (*rem < 2) - return false; - - *(*out)++ = ((code >> 6) & 0x1F) | 0xC0; (*rem)--; - *(*out)++ = ( code & 0x3F) | 0x80; (*rem)--; - - return true; - } - else if (code > 0 && code <= 0xFFFF) { - if (*rem < 3) - return false; - - *(*out)++ = ((code >> 12) & 0x0F) | 0xE0; (*rem)--; - *(*out)++ = ((code >> 6) & 0x3F) | 0x80; (*rem)--; - *(*out)++ = ( code & 0x3F) | 0x80; (*rem)--; - - return true; - } - else if (code > 0 && code <= 0x10FFFF) { - if (*rem < 4) - return false; - - *(*out)++ = ((code >> 18) & 0x07) | 0xF0; (*rem)--; - *(*out)++ = ((code >> 12) & 0x3F) | 0x80; (*rem)--; - *(*out)++ = ((code >> 6) & 0x3F) | 0x80; (*rem)--; - *(*out)++ = ( code & 0x3F) | 0x80; (*rem)--; - - return true; - } - - return true; -} - /* length of the longest token in our lookup table */ #define UC_LEX_MAX_TOKEN_LEN 3 @@ -1187,3 +1135,59 @@ uc_lexer_is_keyword(uc_value_t *label) return false; } + +#endif /* NO_COMPILE */ + +/* + * Stores the given codepoint as a utf8 multibyte sequence into the given + * output buffer and substracts the required amount of bytes from the given + * length pointer. + * + * Returns false if the multibyte sequence would not fit into the buffer, + * otherwise true. + */ + +bool +utf8enc(char **out, int *rem, int code) +{ + if (code >= 0 && code <= 0x7F) { + if (*rem < 1) + return false; + + *(*out)++ = code; (*rem)--; + + return true; + } + else if (code > 0 && code <= 0x7FF) { + if (*rem < 2) + return false; + + *(*out)++ = ((code >> 6) & 0x1F) | 0xC0; (*rem)--; + *(*out)++ = ( code & 0x3F) | 0x80; (*rem)--; + + return true; + } + else if (code > 0 && code <= 0xFFFF) { + if (*rem < 3) + return false; + + *(*out)++ = ((code >> 12) & 0x0F) | 0xE0; (*rem)--; + *(*out)++ = ((code >> 6) & 0x3F) | 0x80; (*rem)--; + *(*out)++ = ( code & 0x3F) | 0x80; (*rem)--; + + return true; + } + else if (code > 0 && code <= 0x10FFFF) { + if (*rem < 4) + return false; + + *(*out)++ = ((code >> 18) & 0x07) | 0xF0; (*rem)--; + *(*out)++ = ((code >> 12) & 0x3F) | 0x80; (*rem)--; + *(*out)++ = ((code >> 6) & 0x3F) | 0x80; (*rem)--; + *(*out)++ = ( code & 0x3F) | 0x80; (*rem)--; + + return true; + } + + return true; +} |