cmdline (merge-intel): don't display control character at the end of line
[libcmdline.git] / src / lib / cmdline_rdline.c
index 15f096d..48cf03e 100644 (file)
@@ -135,6 +135,12 @@ rdline_stop(struct rdline *rdl)
        rdl->status = RDLINE_INIT;
 }
 
+void
+rdline_quit(struct rdline *rdl)
+{
+       rdl->status = RDLINE_EXITED;
+}
+
 void
 rdline_restart(struct rdline *rdl)
 {
@@ -163,14 +169,15 @@ display_right_buffer(struct rdline *rdl)
        unsigned int i;
        char tmp;
 
+       if (CIRBUF_IS_EMPTY(&rdl->right))
+               return;
+
        rdline_puts(rdl, vt100_clear_right);
-       if (!CIRBUF_IS_EMPTY(&rdl->right)) {
-               CIRBUF_FOREACH(&rdl->right, i, tmp) {
-                       rdl->write_char(rdl, tmp);
-               }
-               rdline_miniprintf(rdl, vt100_multi_left,
-                                 CIRBUF_GET_LEN(&rdl->right));
+       CIRBUF_FOREACH(&rdl->right, i, tmp) {
+               rdl->write_char(rdl, tmp);
        }
+       rdline_miniprintf(rdl, vt100_multi_left,
+                         CIRBUF_GET_LEN(&rdl->right));
 }
 
 void
@@ -198,6 +205,8 @@ rdline_char_in(struct rdline *rdl, char c)
        char *buf;
 #endif
 
+       if (rdl->status == RDLINE_EXITED)
+               return RDLINE_RES_EXITED;
        if (rdl->status != RDLINE_RUNNING)
                return RDLINE_RES_NOT_RUNNING;
 
@@ -413,6 +422,9 @@ rdline_char_in(struct rdline *rdl, char c)
 
                        if (rdl->validate)
                                rdl->validate(rdl, rdl->left_buf, CIRBUF_GET_LEN(&rdl->left)+2);
+                       /* user may have stopped rdline */
+                       if (rdl->status == RDLINE_EXITED)
+                               return RDLINE_RES_EXITED;
                        return RDLINE_RES_VALIDATED;
 
 #ifndef NO_RDLINE_HISTORY