Add more functions to manage ini file.
[bertos.git] / bertos / mware / readline.c
index d7c5aa8c0745fb41cf1ec194a782654289209e49..dcad52b4b5bde8af227ca0ce02fc8ab68622a1b6 100644 (file)
@@ -63,8 +63,6 @@
  * \todo Use up/down to move through history  The history line will be copied to the current line,
  * making sure there is room for it.
  *
- * \version $Id$
- *
  * \author Giovanni Bajo <rasky@develer.com>
  */
 
@@ -366,13 +364,6 @@ void rl_refresh(struct RLContext* ctx)
 
 const char* rl_readline(struct RLContext* ctx)
 {
-       size_t i = ctx->history_pos;
-
-       if (ctx->prompt)
-               rl_puts(ctx, ctx->prompt);
-
-       insert_chars(ctx, &i, NULL, 0);
-
        while (1)
        {
                char ch;
@@ -391,20 +382,12 @@ const char* rl_readline(struct RLContext* ctx)
                {
                        // Ask the match hook if available
                        if (!ctx->match)
-                               return false;
+                               return NULL;
 
                        complete_word(ctx, &ctx->line_pos);
                        continue;
                }
 
-               if (c == '\r' || c == '\n')
-               {
-                       // Terminate line
-                       insert_chars(ctx, &ctx->line_pos, NULL, 0);
-                       rl_puts(ctx, "\r\n");
-                       break;
-               }
-
                // Backspace cancels a character, or it is ignored if at
                //  the start of the line
                if (c == '\b')
@@ -417,17 +400,20 @@ const char* rl_readline(struct RLContext* ctx)
                        continue;
                }
 
+               if (c == '\r' || c == '\n')
+               {
+                       rl_puts(ctx, "\r\n");
+                       break;
+               }
+
+
                // Add a character to the buffer, if possible
                ch = (char)c;
                ASSERT2(ch == c, "a special key was not properly handled");
                if (insert_chars(ctx, &ctx->line_pos, &ch, 1))
-               {
                        rl_putc(ctx, ch);
-               }
                else
-               {
                        beep(ctx);
-               }
        }
 
        ctx->history_pos = ctx->line_pos + 1;
@@ -442,9 +428,18 @@ const char* rl_readline(struct RLContext* ctx)
        dump_history(ctx);
 #endif
 
+       const char *buf = &ctx->history[ctx->line_pos + 1];
+
+       ctx->line_pos = ctx->history_pos;
+
+       if (ctx->prompt)
+               rl_puts(ctx, ctx->prompt);
+
+       insert_chars(ctx, &ctx->line_pos, NULL, 0);
+
        // Since the current pointer now points to the separator, we need
        //  to return the first character
-       return &ctx->history[ctx->line_pos + 1];
+       return buf;
 }