* 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
* \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>
*/
#include <cfg/debug.h>
#include <stdio.h>
-#include <drv/ser.h>
-
/// Enable compilation of the unit test code
#define DEBUG_UNIT_TEST 0
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;
{
// 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')
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;
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;
}