X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fmware%2Freadline.c;h=dcad52b4b5bde8af227ca0ce02fc8ab68622a1b6;hb=fb5863ca8d0db3ff2e84721f7c902b031157ebb0;hp=83af2077a4200c9bbd47738fded826c130292ffa;hpb=835ac7cb7d00f28233c0d1d222c688e4df3aba6d;p=bertos.git diff --git a/bertos/mware/readline.c b/bertos/mware/readline.c index 83af2077..dcad52b4 100644 --- a/bertos/mware/readline.c +++ b/bertos/mware/readline.c @@ -42,7 +42,7 @@ * aim at fast performances (line editing does not require to be blazingly fast). * * \li The first character in the history is always \c \\0, and it is used as a guard. By 'wasting' it - * in this way, the code actually gets much simpler in that we remove many checks when moving + * in this way, the code actually gets much simpler in that we remove many checks when moving * backward (\c i>0 and similar). * * \li While editing, the current index points to the position of the buffer which contains the @@ -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,23 +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') - { - if (ctx->prompt) - rl_puts(ctx, ctx->prompt); - - // 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') @@ -420,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; @@ -445,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; }