aboutsummaryrefslogtreecommitdiff
path: root/py/repl.c
diff options
context:
space:
mode:
authorDamien <damien.p.george@gmail.com>2013-10-22 22:32:27 +0100
committerDamien <damien.p.george@gmail.com>2013-10-22 22:32:27 +0100
commit92c06561a3e657924b77aa53725529daddafb343 (patch)
treee5e5a1d8ce294c21eb6c926c42280eab1ed8aed5 /py/repl.c
parent9d63932b3d82752e83281dacead20d412b9e34bb (diff)
Improve REPL compount statement detection.
Diffstat (limited to 'py/repl.c')
-rw-r--r--py/repl.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/py/repl.c b/py/repl.c
new file mode 100644
index 000000000..f295aff23
--- /dev/null
+++ b/py/repl.c
@@ -0,0 +1,44 @@
+#include "misc.h"
+#include "repl.h"
+
+bool str_startswith_word(const char *str, const char *head) {
+ int i;
+ for (i = 0; str[i] && head[i]; i++) {
+ if (str[i] != head[i]) {
+ return false;
+ }
+ }
+ return head[i] == '\0' && (str[i] == '\0' || !g_unichar_isalpha(str[i]));
+}
+
+bool py_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, "true")
+ || str_startswith_word(line, "with")
+ || str_startswith_word(line, "def")
+ || str_startswith_word(line, "class")
+ || str_startswith_word(line, "@")
+ ) {
+ return true;
+ }
+
+ // also "compound" if unmatched open bracket
+ int n_paren = 0;
+ int n_brack = 0;
+ int n_brace = 0;
+ for (const char *l = line; *l; l++) {
+ switch (*l) {
+ 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;
+ }
+ }
+ return n_paren > 0 || n_brack > 0 || n_brace > 0;
+}