X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fmware%2Freadline.c;h=dcad52b4b5bde8af227ca0ce02fc8ab68622a1b6;hb=94f23fc17d4a4a56e66d76e76f23ca35c176f3a6;hp=d7c5aa8c0745fb41cf1ec194a782654289209e49;hpb=7784eb12cf77148c5fdf4094d9bc77aee0ebcc1a;p=bertos.git diff --git a/bertos/mware/readline.c b/bertos/mware/readline.c index d7c5aa8c..dcad52b4 100644 --- a/bertos/mware/readline.c +++ b/bertos/mware/readline.c @@ -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 */ @@ -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; }