/** * \file * * * \brief Line editing support with history * * This file implements a kernel for line editing through a terminal, with history of the typed lines. * Basic feature of this module: * * \li Abstracted from I/O. The user must provide hooks for getc and putc functions. * \li Basic support for ANSI escape sequences for input of special codes. * \li Support for command name completion (through a hook). * * * \author Giovanni Bajo * * $WIZ$ module_name = "readline" * $WIZ$ module_depends = "sprintf" */ #ifndef MWARE_READLINE_H #define MWARE_READLINE_H #include #include #define HISTORY_SIZE 32 typedef int (*getc_hook)(void* user_data); typedef void (*putc_hook)(char ch, void* user_data); typedef const char* (*match_hook)(void* user_data, const char* word, int word_len); typedef void (*clear_hook)(void* user_data); struct RLContext { getc_hook get; void* get_param; putc_hook put; void* put_param; match_hook match; void* match_param; clear_hook clear; void* clear_param; const char* prompt; char real_history[HISTORY_SIZE]; char* history; size_t history_pos; size_t line_pos; }; INLINE void rl_init_ctx(struct RLContext *ctx) { memset(ctx, 0, sizeof(*ctx)); ctx->history = ctx->real_history; } INLINE void rl_clear_history(struct RLContext *ctx) { memset(ctx->real_history, 0, sizeof(ctx->real_history)); ctx->history_pos = 0; ctx->line_pos = ctx->history_pos; ctx->history = ctx->real_history; } INLINE void rl_sethook_get(struct RLContext* ctx, getc_hook get, void* get_param) { ctx->get = get; ctx->get_param = get_param; } INLINE void rl_sethook_put(struct RLContext* ctx, putc_hook put, void* put_param) { ctx->put = put; ctx->put_param = put_param; } INLINE void rl_sethook_match(struct RLContext* ctx, match_hook match, void* match_param) { ctx->match = match; ctx->match_param = match_param; } INLINE void rl_sethook_clear(struct RLContext* ctx, clear_hook clear, void* clear_param) { ctx->clear = clear; ctx->clear_param = clear_param; } INLINE void rl_setprompt(struct RLContext* ctx, const char* prompt) { ctx->prompt = prompt; } const char* rl_readline(struct RLContext* ctx); void rl_refresh(struct RLContext* ctx); #endif /* MWARE_READLINE_H */