X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fmware%2Freadline.c;h=dcad52b4b5bde8af227ca0ce02fc8ab68622a1b6;hb=088cc866a57a0402f6ba3f232fcf8f59c79626d1;hp=4c3b3a81e5eb26fb266672a42f152a09b7dd9aca;hpb=791e167e053bdd9250d34a9a5ccae6ccde4d6679;p=bertos.git diff --git a/bertos/mware/readline.c b/bertos/mware/readline.c index 4c3b3a81..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 */ @@ -75,8 +73,6 @@ #include #include -#include - /// Enable compilation of the unit test code #define DEBUG_UNIT_TEST 0 @@ -368,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; @@ -393,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') @@ -422,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; @@ -447,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; }