aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmdline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cmdline.cpp')
-rw-r--r--cmdline.cpp62
1 files changed, 44 insertions, 18 deletions
diff --git a/cmdline.cpp b/cmdline.cpp
index e0159ec..b9c58a0 100644
--- a/cmdline.cpp
+++ b/cmdline.cpp
@@ -5,8 +5,10 @@
#include "sciteco.h"
#include "parser.h"
+#include "goto.h"
#include "undo.h"
+static inline const gchar *process_edit_cmd(gchar key);
static gchar *macro_echo(const gchar *macro, const gchar *prefix = "");
gchar *cmdline = NULL;
@@ -14,27 +16,14 @@ gchar *cmdline = NULL;
void
cmdline_keypress(gchar key)
{
- gchar insert[255] = "";
+ const gchar *insert;
gint old_cmdline_len = 0;
gchar *echo;
/*
* Process immediate editing commands
*/
- switch (key) {
- case '\b':
- if (!cmdline || !*cmdline)
- break;
- old_cmdline_len = strlen(cmdline);
-
- undo.pop(old_cmdline_len);
- cmdline[old_cmdline_len-1] = '\0';
- macro_pc--;
- break;
- default:
- insert[0] = key;
- insert[1] = '\0';
- }
+ insert = process_edit_cmd(key);
/*
* Parse/execute characters
@@ -44,12 +33,12 @@ cmdline_keypress(gchar key)
cmdline = (gchar *)g_realloc(cmdline, old_cmdline_len +
strlen(insert) + 1);
} else {
- cmdline = (gchar *)g_malloc(2);
+ cmdline = (gchar *)g_malloc(strlen(insert) + 1);
*cmdline = '\0';
}
- for (gchar *p = insert; *p; p++) {
- strcat(cmdline, (gchar[]){key, '\0'});
+ for (const gchar *p = insert; *p; p++) {
+ strcat(cmdline, (gchar[]){*p, '\0'});
if (!macro_execute(cmdline)) {
cmdline[old_cmdline_len] = '\0';
@@ -65,6 +54,43 @@ cmdline_keypress(gchar key)
g_free(echo);
}
+static inline const gchar *
+process_edit_cmd(gchar key)
+{
+ static gchar insert[255];
+ gint cmdline_len = cmdline ? strlen(cmdline) : 0;
+
+ insert[0] = '\0';
+
+ switch (key) {
+ case '\b':
+ if (cmdline_len) {
+ undo.pop(cmdline_len);
+ cmdline[cmdline_len - 1] = '\0';
+ macro_pc--;
+ }
+ break;
+
+ case '\x1B':
+ if (cmdline && cmdline[cmdline_len - 1] == '\x1B') {
+ /* TODO: exit if previously requested */
+
+ undo.clear();
+ goto_table_clear();
+
+ *cmdline = '\0';
+ macro_pc = 0;
+ break;
+ }
+ /* fall through */
+ default:
+ insert[0] = key;
+ insert[1] = '\0';
+ }
+
+ return insert;
+}
+
static gchar *
macro_echo(const gchar *macro, const gchar *prefix)
{