chry_readline.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * Copyright (c) 2022, Egahp
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #ifndef CHRY_READLINE_H
  7. #define CHRY_READLINE_H
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #include <stdint.h>
  12. #include "chry_readline_keycode.h"
  13. #include "chry_readline_config.h"
  14. #if defined(CONFIG_READLINE_XTERM) && defined(CONFIG_READLINE_NOBLOCK)
  15. #if CONFIG_READLINE_XTERM && CONFIG_READLINE_NOBLOCK
  16. #error "CONFIG_READLINE_XTERM cannot be configured at the same time as CONFIG_READLINE_NOBLOCK"
  17. #endif
  18. #endif
  19. enum {
  20. CHRY_READLINE_SGR_NONE = 0,
  21. CHRY_READLINE_SGR_BLACK = 1,
  22. CHRY_READLINE_SGR_RED = 2,
  23. CHRY_READLINE_SGR_GREEN = 3,
  24. CHRY_READLINE_SGR_YELLOW = 4,
  25. CHRY_READLINE_SGR_BLUE = 5,
  26. CHRY_READLINE_SGR_MAGENTA = 6,
  27. CHRY_READLINE_SGR_CYAN = 7,
  28. CHRY_READLINE_SGR_WHITE = 8,
  29. CHRY_READLINE_SGR_DEFAULT = 10
  30. };
  31. typedef struct chry_readline {
  32. char *prompt; /*!< prompt pointer */
  33. uint16_t (*sput)(struct chry_readline *rl, const void *data, uint16_t size);
  34. uint16_t (*sget)(struct chry_readline *rl, void *data, uint16_t size);
  35. struct
  36. {
  37. struct {
  38. uint16_t size; /*!< linesize */
  39. char pbuf[0]; /*!< linebuff pointer */
  40. } *buff;
  41. uint16_t pptsize; /*!< prompt size */
  42. uint16_t pptoff; /*!< prompt offset */
  43. uint16_t pptlen; /*!< prompt strlen */
  44. uint16_t lnmax; /*!< linebuff max */
  45. uint16_t curoff; /*!< cursor offset */
  46. uint16_t mask; /*!< line mask */
  47. } ln;
  48. struct
  49. {
  50. union {
  51. uint16_t altnsupt; /*!< is screen not supported but alt buffer */
  52. struct {
  53. uint8_t nsupt; /*!< is screen not supported */
  54. uint8_t alt; /*!< is screen alt buffer */
  55. };
  56. };
  57. uint16_t row; /*!< terminal row */
  58. uint16_t col; /*!< terminal column */
  59. } term;
  60. #if defined(CONFIG_READLINE_COMPLETION) && CONFIG_READLINE_COMPLETION
  61. struct {
  62. uint8_t (*acb)(struct chry_readline *rl, char *pre, uint16_t *size, const char **argv, uint8_t *argl, uint8_t argcmax);
  63. } cplt;
  64. #endif
  65. #if defined(CONFIG_READLINE_HISTORY) && CONFIG_READLINE_HISTORY
  66. struct {
  67. char *pbuf; /*!< histfifo buffer */
  68. uint16_t in; /*!< histfifo in pos */
  69. uint16_t out; /*!< histfifo out pos */
  70. uint16_t mask; /*!< histfifo mask */
  71. uint16_t size; /*!< histfifo size */
  72. uint16_t cache; /*!< history cache */
  73. uint16_t index; /*!< history index */
  74. } hist;
  75. #endif
  76. int (*ucb)(struct chry_readline *rl, uint8_t exec);
  77. uint8_t ignore; /*!< only accept */
  78. uint8_t auto_refresh; /*!< auto refresh */
  79. #if defined(CONFIG_READLINE_CTRLMAP) && CONFIG_READLINE_CTRLMAP
  80. uint8_t ctrlmap[32];
  81. #endif
  82. #if defined(CONFIG_READLINE_ALTMAP) && CONFIG_READLINE_ALTMAP
  83. uint8_t altmap[26];
  84. #endif
  85. #if defined(CONFIG_READLINE_PROMPTEDIT) && CONFIG_READLINE_PROMPTEDIT
  86. uint8_t pptseglen[CONFIG_READLINE_PROMPTSEG + 1];
  87. #endif
  88. #if defined(CONFIG_READLINE_NOBLOCK) && CONFIG_READLINE_NOBLOCK
  89. uint8_t noblock;
  90. uint8_t block;
  91. #endif
  92. } chry_readline_t;
  93. typedef struct {
  94. char *prompt; /*!< prompt buffer pointer */
  95. uint16_t pptsize; /*!< prompt buffer size */
  96. char *history; /*!< history buffer pointer */
  97. uint16_t histsize; /*!< history buffer size, must be a power of 2 */
  98. uint16_t (*sput)(chry_readline_t *rl, const void *, uint16_t);
  99. uint16_t (*sget)(chry_readline_t *rl, void *, uint16_t);
  100. } chry_readline_init_t;
  101. typedef struct
  102. {
  103. union {
  104. uint16_t raw;
  105. struct
  106. {
  107. uint16_t foreground : 6;
  108. uint16_t bold : 1;
  109. uint16_t underline : 1;
  110. uint16_t background : 6;
  111. uint16_t blink : 1;
  112. uint16_t inverse : 1;
  113. };
  114. };
  115. } chry_readline_sgr_t;
  116. extern int chry_readline_init(chry_readline_t *rl, chry_readline_init_t *init);
  117. extern void chry_readline_debug(chry_readline_t *rl);
  118. extern char *chry_readline(chry_readline_t *rl, char *linebuff, uint16_t buffsize, uint16_t *linesize);
  119. extern int chry_readline_edit_refresh(chry_readline_t *rl);
  120. extern int chry_readline_edit_clear(chry_readline_t *rl);
  121. extern int chry_readline_edit_insert(chry_readline_t *rl, char c);
  122. extern int chry_readline_edit_backspace(chry_readline_t *rl);
  123. extern int chry_readline_edit_delete(chry_readline_t *rl);
  124. extern int chry_readline_edit_moveleft(chry_readline_t *rl);
  125. extern int chry_readline_edit_moveright(chry_readline_t *rl);
  126. extern int chry_readline_edit_movehome(chry_readline_t *rl);
  127. extern int chry_readline_edit_moveend(chry_readline_t *rl);
  128. extern int chry_readline_edit_delline(chry_readline_t *rl);
  129. extern int chry_readline_edit_delend(chry_readline_t *rl);
  130. extern int chry_readline_edit_delword(chry_readline_t *rl);
  131. extern int chry_readline_complete(chry_readline_t *rl);
  132. extern void chry_readline_erase_line(chry_readline_t *rl);
  133. extern void chry_readline_newline(chry_readline_t *rl);
  134. extern void chry_readline_detect(chry_readline_t *rl);
  135. extern void chry_readline_clear(chry_readline_t *rl);
  136. extern void chry_readline_block(chry_readline_t *rl, uint8_t enable);
  137. extern void chry_readline_ignore(chry_readline_t *rl, uint8_t enable);
  138. extern void chry_readline_auto_refresh(chry_readline_t *rl, uint8_t enable);
  139. extern void chry_readline_mask(chry_readline_t *rl, uint8_t enable);
  140. extern int chry_readline_altscreen(chry_readline_t *rl, uint8_t enable);
  141. extern void chry_readline_set_completion_cb(chry_readline_t *rl, uint8_t (*acb)(chry_readline_t *rl, char *pre, uint16_t *size, const char **argv, uint8_t *argl, uint8_t argcmax));
  142. extern void chry_readline_set_user_cb(chry_readline_t *rl, int (*ucb)(chry_readline_t *rl, uint8_t exec));
  143. extern void chry_readline_set_ctrlmap(chry_readline_t *rl, uint8_t mapidx, uint8_t exec);
  144. extern void chry_readline_set_altmap(chry_readline_t *rl, uint8_t mapidx, uint8_t exec);
  145. extern int chry_readline_prompt_edit(chry_readline_t *rl, uint8_t segidx, uint16_t sgrraw, const char *format, ...);
  146. extern void chry_readline_prompt_clear(chry_readline_t *rl);
  147. #ifdef __cplusplus
  148. }
  149. #endif
  150. #endif