From 0b7e29c025621d940552e66d26b7470f36c579df Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky <pfalcon@users.sourceforge.net> Date: Tue, 28 Jan 2014 03:40:06 +0200 Subject: [PATCH] Factor out quoted string print function for reuse (mp_str_print_quoted()). --- py/obj.h | 1 + py/objstr.c | 66 ++++++++++++++++++++++++++++------------------------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/py/obj.h b/py/obj.h index 9c6a35422..4e2c95683 100644 --- a/py/obj.h +++ b/py/obj.h @@ -291,6 +291,7 @@ uint mp_obj_str_get_len(mp_obj_t self_in); qstr mp_obj_str_get_qstr(mp_obj_t self_in); // use this if you will anyway convert the string to a qstr const char *mp_obj_str_get_str(mp_obj_t self_in); // use this only if you need the string to be null terminated const byte *mp_obj_str_get_data(mp_obj_t self_in, uint *len); +void mp_str_print_quoted(void (*print)(void *env, const char *fmt, ...), void *env, const byte *str_data, uint str_len); // bytes extern const mp_obj_type_t bytes_type; diff --git a/py/objstr.c b/py/objstr.c index 84ac74bab..c30da00d7 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -34,45 +34,49 @@ static mp_obj_t mp_obj_new_bytes_iterator(mp_obj_t str); /******************************************************************************/ /* str */ -void str_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { +void mp_str_print_quoted(void (*print)(void *env, const char *fmt, ...), void *env, const byte *str_data, uint str_len) { + // this escapes characters, but it will be very slow to print (calling print many times) + bool has_single_quote = false; + bool has_double_quote = false; + for (const byte *s = str_data, *top = str_data + str_len; (!has_single_quote || !has_double_quote) && s < top; s++) { + if (*s == '\'') { + has_single_quote = true; + } else if (*s == '"') { + has_double_quote = true; + } + } + int quote_char = '\''; + if (has_single_quote && !has_double_quote) { + quote_char = '"'; + } + print(env, "%c", quote_char); + for (const byte *s = str_data, *top = str_data + str_len; s < top; s++) { + if (*s == quote_char) { + print(env, "\\%c", quote_char); + } else if (*s == '\\') { + print(env, "\\\\"); + } else if (32 <= *s && *s <= 126) { + print(env, "%c", *s); + } else if (*s == '\n') { + print(env, "\\n"); + // TODO add more escape codes here if we want to match CPython + } else { + print(env, "\\x%02x", *s); + } + } + print(env, "%c", quote_char); +} + +static void str_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { GET_STR_DATA_LEN(self_in, str_data, str_len); bool is_bytes = MP_OBJ_IS_TYPE(self_in, &bytes_type); if (kind == PRINT_STR && !is_bytes) { print(env, "%.*s", str_len, str_data); } else { - // this escapes characters, but it will be very slow to print (calling print many times) - bool has_single_quote = false; - bool has_double_quote = false; - for (const byte *s = str_data, *top = str_data + str_len; (!has_single_quote || !has_double_quote) && s < top; s++) { - if (*s == '\'') { - has_single_quote = true; - } else if (*s == '"') { - has_double_quote = true; - } - } if (is_bytes) { print(env, "b"); } - int quote_char = '\''; - if (has_single_quote && !has_double_quote) { - quote_char = '"'; - } - print(env, "%c", quote_char); - for (const byte *s = str_data, *top = str_data + str_len; s < top; s++) { - if (*s == quote_char) { - print(env, "\\%c", quote_char); - } else if (*s == '\\') { - print(env, "\\\\"); - } else if (32 <= *s && *s <= 126) { - print(env, "%c", *s); - } else if (*s == '\n') { - print(env, "\\n"); - // TODO add more escape codes here if we want to match CPython - } else { - print(env, "\\x%02x", *s); - } - } - print(env, "%c", quote_char); + mp_str_print_quoted(print, env, str_data, str_len); } } -- GitLab