From 8cc96a35e532ef999e5a3739deeb44f51a80744b Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 30 Dec 2013 18:23:50 +0000 Subject: Put unicode functions in unicode.c, and tidy their names. --- py/lexer.c | 14 +++++----- py/misc.c | 84 ------------------------------------------------------------ py/misc.h | 23 +++++------------ py/parse.c | 2 +- py/repl.c | 2 +- py/runtime.c | 10 +++----- py/unicode.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 96 insertions(+), 116 deletions(-) delete mode 100644 py/misc.c create mode 100644 py/unicode.c (limited to 'py') diff --git a/py/lexer.c b/py/lexer.c index 6e43c7469..4df91b036 100644 --- a/py/lexer.c +++ b/py/lexer.c @@ -54,9 +54,9 @@ void mp_token_show(const mp_token_t *tok) { const char *j = i + tok->len; printf(" "); while (i < j) { - unichar c = g_utf8_get_char(i); - i = g_utf8_next_char(i); - if (g_unichar_isprint(c)) { + unichar c = utf8_get_char(i); + i = utf8_next_char(i); + if (unichar_isprint(c)) { printf("%c", c); } else { printf("?"); @@ -116,19 +116,19 @@ static bool is_char_and(mp_lexer_t *lex, char c1, char c2) { } static bool is_whitespace(mp_lexer_t *lex) { - return g_unichar_isspace(lex->chr0); + return unichar_isspace(lex->chr0); } static bool is_letter(mp_lexer_t *lex) { - return g_unichar_isalpha(lex->chr0); + return unichar_isalpha(lex->chr0); } static bool is_digit(mp_lexer_t *lex) { - return g_unichar_isdigit(lex->chr0); + return unichar_isdigit(lex->chr0); } static bool is_following_digit(mp_lexer_t *lex) { - return g_unichar_isdigit(lex->chr1); + return unichar_isdigit(lex->chr1); } // TODO UNICODE include unicode characters in definition of identifiers diff --git a/py/misc.c b/py/misc.c deleted file mode 100644 index a5bf8d553..000000000 --- a/py/misc.c +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include - -#include "misc.h" - -// attribute flags -#define FL_PRINT (0x01) -#define FL_SPACE (0x02) -#define FL_DIGIT (0x04) -#define FL_ALPHA (0x08) -#define FL_UPPER (0x10) -#define FL_LOWER (0x20) - -// shorthand character attributes -#define AT_PR (FL_PRINT) -#define AT_SP (FL_SPACE | FL_PRINT) -#define AT_DI (FL_DIGIT | FL_PRINT) -#define AT_AL (FL_ALPHA | FL_PRINT) -#define AT_UP (FL_UPPER | FL_ALPHA | FL_PRINT) -#define AT_LO (FL_LOWER | FL_ALPHA | FL_PRINT) - -// table of attributes for ascii characters -static const uint8_t attr[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, AT_SP, AT_SP, AT_SP, 0, AT_SP, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - AT_SP, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, - AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, - AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, - AT_DI, AT_DI, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, - AT_PR, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, - AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, - AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, - AT_UP, AT_UP, AT_UP, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, - AT_PR, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, - AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, - AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, - AT_LO, AT_LO, AT_LO, AT_PR, AT_PR, AT_PR, AT_PR, 0 -}; - -unichar g_utf8_get_char(const char *s) { - return *s; -} - -char *g_utf8_next_char(const char *s) { - return (char*)(s + 1); -} - -bool g_unichar_isspace(unichar c) { - return c < 128 && (attr[c] & FL_SPACE) != 0; -} - -bool g_unichar_isalpha(unichar c) { - return c < 128 && (attr[c] & FL_ALPHA) != 0; -} - -bool g_unichar_isprint(unichar c) { - return c < 128 && (attr[c] & FL_PRINT) != 0; -} - -bool g_unichar_isdigit(unichar c) { - return c < 128 && (attr[c] & FL_DIGIT) != 0; -} - -/* -bool char_is_alpha_or_digit(unichar c) { - return c < 128 && (attr[c] & (FL_ALPHA | FL_DIGIT)) != 0; -} - -bool char_is_upper(unichar c) { - return c < 128 && (attr[c] & FL_UPPER) != 0; -} - -bool char_is_lower(unichar c) { - return c < 128 && (attr[c] & FL_LOWER) != 0; -} -*/ - -/* -char *g_strdup(const char *s) { - return strdup(s); -} -*/ diff --git a/py/misc.h b/py/misc.h index 1a33f0505..9f83ab526 100644 --- a/py/misc.h +++ b/py/misc.h @@ -37,24 +37,13 @@ int m_get_total_bytes_allocated(void); typedef int unichar; // TODO -unichar g_utf8_get_char(const char *s); -char *g_utf8_next_char(const char *s); +unichar utf8_get_char(const char *s); +char *utf8_next_char(const char *s); -bool g_unichar_isspace(unichar c); -bool g_unichar_isalpha(unichar c); -bool g_unichar_isprint(unichar c); -bool g_unichar_isdigit(unichar c); - -//char *g_strdup(const char *s); - -/** blob ********************************************************/ - -/* -unsigned short decode_le16(byte *buf); -unsigned int decode_le32(byte *buf); -void encode_le16(byte *buf, unsigned short i); -void encode_le32(byte *buf, unsigned int i); -*/ +bool unichar_isspace(unichar c); +bool unichar_isalpha(unichar c); +bool unichar_isprint(unichar c); +bool unichar_isdigit(unichar c); /** string ******************************************************/ diff --git a/py/parse.c b/py/parse.c index ad9a47ffb..d3786ba95 100644 --- a/py/parse.c +++ b/py/parse.c @@ -212,7 +212,7 @@ static void push_result_token(parser_t *parser, const mp_lexer_t *lex) { } } for (; i < len; i++) { - if (g_unichar_isdigit(str[i]) && str[i] - '0' < base) { + if (unichar_isdigit(str[i]) && str[i] - '0' < base) { int_val = base * int_val + str[i] - '0'; } else if (base == 16 && 'a' <= str[i] && str[i] <= 'f') { int_val = base * int_val + str[i] - 'a' + 10; diff --git a/py/repl.c b/py/repl.c index ecf6e2d20..4241ef0e4 100644 --- a/py/repl.c +++ b/py/repl.c @@ -8,7 +8,7 @@ bool str_startswith_word(const char *str, const char *head) { return false; } } - return head[i] == '\0' && (str[i] == '\0' || !g_unichar_isalpha(str[i])); + return head[i] == '\0' && (str[i] == '\0' || !unichar_isalpha(str[i])); } bool mp_repl_is_compound_stmt(const char *line) { diff --git a/py/runtime.c b/py/runtime.c index 1598cc291..748294c35 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -226,7 +226,7 @@ void rt_assign_native_code(int unique_code_id, void *fun, uint len, int n_args) unique_codes[unique_code_id].is_generator = false; unique_codes[unique_code_id].u_native.fun = fun; - printf("native code: %d bytes\n", len); + //printf("native code: %d bytes\n", len); #ifdef DEBUG_PRINT DEBUG_printf("assign native code: id=%d fun=%p len=%u n_args=%d\n", unique_code_id, fun, len, n_args); @@ -421,8 +421,7 @@ mp_obj_t rt_load_build_class(void) { DEBUG_OP_printf("load_build_class\n"); mp_map_elem_t *elem = mp_qstr_map_lookup(&map_builtins, rt_q___build_class__, false); if (elem == NULL) { - printf("name doesn't exist: __build_class__\n"); - assert(0); + nlr_jump(mp_obj_new_exception_msg(rt_q_NameError, "name '__build_class__' is not defined")); } return elem->value; } @@ -525,7 +524,7 @@ mp_obj_t rt_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) { break; } - default: printf("%d\n", op); assert(0); + default: assert(0); } if (fit_small_int(lhs_val)) { return MP_OBJ_NEW_SMALL_INT(lhs_val); @@ -831,8 +830,7 @@ void rt_store_attr(mp_obj_t base, qstr attr, mp_obj_t value) { } else if (MP_OBJ_IS_TYPE(base, &instance_type)) { mp_obj_instance_store_attr(base, attr, value); } else { - printf("?AttributeError: '%s' object has no attribute '%s'\n", mp_obj_get_type_str(base), qstr_str(attr)); - assert(0); + nlr_jump(mp_obj_new_exception_msg_2_args(rt_q_AttributeError, "'%s' object has no attribute '%s'", mp_obj_get_type_str(base), qstr_str(attr))); } } diff --git a/py/unicode.c b/py/unicode.c new file mode 100644 index 000000000..58c860a0e --- /dev/null +++ b/py/unicode.c @@ -0,0 +1,77 @@ +#include + +#include "misc.h" + +// attribute flags +#define FL_PRINT (0x01) +#define FL_SPACE (0x02) +#define FL_DIGIT (0x04) +#define FL_ALPHA (0x08) +#define FL_UPPER (0x10) +#define FL_LOWER (0x20) + +// shorthand character attributes +#define AT_PR (FL_PRINT) +#define AT_SP (FL_SPACE | FL_PRINT) +#define AT_DI (FL_DIGIT | FL_PRINT) +#define AT_AL (FL_ALPHA | FL_PRINT) +#define AT_UP (FL_UPPER | FL_ALPHA | FL_PRINT) +#define AT_LO (FL_LOWER | FL_ALPHA | FL_PRINT) + +// table of attributes for ascii characters +static const uint8_t attr[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, AT_SP, AT_SP, AT_SP, 0, AT_SP, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + AT_SP, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, + AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, + AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, AT_DI, + AT_DI, AT_DI, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, + AT_PR, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, + AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, + AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, AT_UP, + AT_UP, AT_UP, AT_UP, AT_PR, AT_PR, AT_PR, AT_PR, AT_PR, + AT_PR, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, + AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, + AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, AT_LO, + AT_LO, AT_LO, AT_LO, AT_PR, AT_PR, AT_PR, AT_PR, 0 +}; + +unichar utf8_get_char(const char *s) { + return *s; +} + +char *utf8_next_char(const char *s) { + return (char*)(s + 1); +} + +bool unichar_isspace(unichar c) { + return c < 128 && (attr[c] & FL_SPACE) != 0; +} + +bool unichar_isalpha(unichar c) { + return c < 128 && (attr[c] & FL_ALPHA) != 0; +} + +bool unichar_isprint(unichar c) { + return c < 128 && (attr[c] & FL_PRINT) != 0; +} + +bool unichar_isdigit(unichar c) { + return c < 128 && (attr[c] & FL_DIGIT) != 0; +} + +/* +bool char_is_alpha_or_digit(unichar c) { + return c < 128 && (attr[c] & (FL_ALPHA | FL_DIGIT)) != 0; +} + +bool char_is_upper(unichar c) { + return c < 128 && (attr[c] & FL_UPPER) != 0; +} + +bool char_is_lower(unichar c) { + return c < 128 && (attr[c] & FL_LOWER) != 0; +} +*/ -- cgit v1.2.3