diff --git a/py/repl.c b/py/repl.c index 736dfa3f69..962a6f72e7 100644 --- a/py/repl.c +++ b/py/repl.c @@ -59,38 +59,47 @@ bool mp_repl_continue_with_input(const char *input) { || str_startswith_word(input, "class") ; - // check for unmatched open bracket or triple quote - // TODO don't look at triple quotes inside single quotes + // check for unmatched open bracket or quote + #define Q_NONE (0) + #define Q_1_SINGLE (1) + #define Q_1_DOUBLE (2) + #define Q_3_SINGLE (3) + #define Q_3_DOUBLE (4) int n_paren = 0; int n_brack = 0; int n_brace = 0; - int in_triple_quote = 0; + int in_quote = Q_NONE; 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 (in_triple_quote != '\'' && i[1] == '"' && i[2] == '"') { - i += 2; - in_triple_quote = '"' - in_triple_quote; - } - break; + if (*i == '\'') { + if ((in_quote == Q_NONE || in_quote == Q_3_SINGLE) && i[1] == '\'' && i[2] == '\'') { + i += 2; + in_quote = Q_3_SINGLE - in_quote; + } else if (in_quote == Q_NONE || in_quote == Q_1_SINGLE) { + in_quote = Q_1_SINGLE - in_quote; + } + } else if (*i == '"') { + if ((in_quote == Q_NONE || in_quote == Q_3_DOUBLE) && i[1] == '"' && i[2] == '"') { + i += 2; + in_quote = Q_3_DOUBLE - in_quote; + } else if (in_quote == Q_NONE || in_quote == Q_1_DOUBLE) { + in_quote = Q_1_DOUBLE - in_quote; + } + } else if (in_quote == Q_NONE) { + 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; + default: break; + } } } // continue if unmatched brackets or quotes - if (n_paren > 0 || n_brack > 0 || n_brace > 0 || in_triple_quote != 0) { + if (n_paren > 0 || n_brack > 0 || n_brace > 0 || in_quote == Q_3_SINGLE || in_quote == Q_3_DOUBLE) { return true; }