summaryrefslogtreecommitdiffstatshomepage
path: root/py/repl.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/repl.c')
-rw-r--r--py/repl.c63
1 files changed, 43 insertions, 20 deletions
diff --git a/py/repl.c b/py/repl.c
index bca1be584e..4cafb88e2d 100644
--- a/py/repl.c
+++ b/py/repl.c
@@ -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