diff options
Diffstat (limited to 'py/repl.c')
-rw-r--r-- | py/repl.c | 63 |
1 files changed, 43 insertions, 20 deletions
@@ -14,43 +14,66 @@ bool str_startswith_word(const char *str, const char *head) { return head[i] == '\0' && (str[i] == '\0' || !unichar_isalpha(str[i])); } -bool mp_repl_is_compound_stmt(const char *line) { - // compound if line starts with a certain keyword - if ( - str_startswith_word(line, "if") - || str_startswith_word(line, "while") - || str_startswith_word(line, "for") - || str_startswith_word(line, "try") - || str_startswith_word(line, "with") - || str_startswith_word(line, "def") - || str_startswith_word(line, "class") - || str_startswith_word(line, "@") - ) { - return true; +bool mp_repl_continue_with_input(const char *input) { + // check for blank input + if (input[0] == '\0') { + return false; } - // also "compound" if unmatched open bracket or triple quote + // check if input starts with a certain keyword + bool starts_with_compound_keyword = + input[0] == '@' + || str_startswith_word(input, "if") + || str_startswith_word(input, "while") + || str_startswith_word(input, "for") + || str_startswith_word(input, "try") + || str_startswith_word(input, "with") + || str_startswith_word(input, "def") + || str_startswith_word(input, "class") + ; + + // check for unmatched open bracket or triple quote + // TODO don't look at triple quotes inside single quotes int n_paren = 0; int n_brack = 0; int n_brace = 0; int in_triple_quote = 0; - for (const char *l = line; *l; l++) { - switch (*l) { + const char *i; + for (i = input; *i; i++) { + switch (*i) { case '(': n_paren += 1; break; case ')': n_paren -= 1; break; case '[': n_brack += 1; break; case ']': n_brack -= 1; break; case '{': n_brace += 1; break; case '}': n_brace -= 1; break; + case '\'': + if (in_triple_quote != '"' && i[1] == '\'' && i[2] == '\'') { + i += 2; + in_triple_quote = '\'' - in_triple_quote; + } + break; case '"': - if (l[1] == '"' && l[2] == '"') { - l += 2; - in_triple_quote = 1 - in_triple_quote; + if (in_triple_quote != '\'' && i[1] == '"' && i[2] == '"') { + i += 2; + in_triple_quote = '"' - in_triple_quote; } break; } } - return n_paren > 0 || n_brack > 0 || n_brace > 0 || in_triple_quote != 0; + + // continue if unmatched brackets or quotes + if (n_paren > 0 || n_brack > 0 || n_brace > 0 || in_triple_quote != 0) { + return true; + } + + // continue if compound keyword and last line was not empty + if (starts_with_compound_keyword && i[-1] != '\n') { + return true; + } + + // otherwise, don't continue + return false; } #endif // MICROPY_ENABLE_REPL_HELPERS |