xref: /dpdk/lib/cmdline/cmdline_private.h (revision a71cdcc50253510978537d08de96586834268417)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright (c) 2020 Dmitry Kozlyuk
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _CMDLINE_PRIVATE_H_
699a2dd95SBruce Richardson #define _CMDLINE_PRIVATE_H_
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson #include <stdarg.h>
999a2dd95SBruce Richardson 
1099a2dd95SBruce Richardson #include <rte_common.h>
1199a2dd95SBruce Richardson #include <rte_os_shim.h>
1299a2dd95SBruce Richardson #ifdef RTE_EXEC_ENV_WINDOWS
1399a2dd95SBruce Richardson #include <rte_windows.h>
14*a71cdcc5SGregory Etelson #ifndef LINE_MAX
15*a71cdcc5SGregory Etelson /**
16*a71cdcc5SGregory Etelson  * The LINE_MAX value is derived from POSIX.
17*a71cdcc5SGregory Etelson  * Windows environment may not have POSIX definitions.
18*a71cdcc5SGregory Etelson  */
19*a71cdcc5SGregory Etelson #define LINE_MAX 2048
20*a71cdcc5SGregory Etelson #endif
21f43809d2SDmitry Kozlyuk #else
22f43809d2SDmitry Kozlyuk #include <termios.h>
2399a2dd95SBruce Richardson #endif
2499a2dd95SBruce Richardson 
2599a2dd95SBruce Richardson #include <cmdline.h>
2699a2dd95SBruce Richardson 
27*a71cdcc5SGregory Etelson #define RDLINE_BUF_SIZE LINE_MAX
28f8f8dc28SDmitry Kozlyuk #define RDLINE_PROMPT_SIZE  32
29f8f8dc28SDmitry Kozlyuk #define RDLINE_VT100_BUF_SIZE  8
30f8f8dc28SDmitry Kozlyuk #define RDLINE_HISTORY_BUF_SIZE BUFSIZ
31f8f8dc28SDmitry Kozlyuk #define RDLINE_HISTORY_MAX_LINE 64
32f8f8dc28SDmitry Kozlyuk 
33f8f8dc28SDmitry Kozlyuk struct rdline {
34f1d0993eSStephen Hemminger 	volatile enum rdline_status status;
35f8f8dc28SDmitry Kozlyuk 	/* rdline bufs */
36f8f8dc28SDmitry Kozlyuk 	struct cirbuf left;
37f8f8dc28SDmitry Kozlyuk 	struct cirbuf right;
38f8f8dc28SDmitry Kozlyuk 	char left_buf[RDLINE_BUF_SIZE+2]; /* reserve 2 chars for the \n\0 */
39f8f8dc28SDmitry Kozlyuk 	char right_buf[RDLINE_BUF_SIZE];
40f8f8dc28SDmitry Kozlyuk 
41f8f8dc28SDmitry Kozlyuk 	char prompt[RDLINE_PROMPT_SIZE];
42f8f8dc28SDmitry Kozlyuk 	unsigned int prompt_size;
43f8f8dc28SDmitry Kozlyuk 
44f8f8dc28SDmitry Kozlyuk 	char kill_buf[RDLINE_BUF_SIZE];
45f8f8dc28SDmitry Kozlyuk 	unsigned int kill_size;
46f8f8dc28SDmitry Kozlyuk 
47f8f8dc28SDmitry Kozlyuk 	/* history */
48f8f8dc28SDmitry Kozlyuk 	struct cirbuf history;
49f8f8dc28SDmitry Kozlyuk 	char history_buf[RDLINE_HISTORY_BUF_SIZE];
50f8f8dc28SDmitry Kozlyuk 	int history_cur_line;
51f8f8dc28SDmitry Kozlyuk 
52f8f8dc28SDmitry Kozlyuk 	/* callbacks and func pointers */
53f8f8dc28SDmitry Kozlyuk 	rdline_write_char_t *write_char;
54f8f8dc28SDmitry Kozlyuk 	rdline_validate_t *validate;
55f8f8dc28SDmitry Kozlyuk 	rdline_complete_t *complete;
56f8f8dc28SDmitry Kozlyuk 
57f8f8dc28SDmitry Kozlyuk 	/* vt100 parser */
58f8f8dc28SDmitry Kozlyuk 	struct cmdline_vt100 vt100;
59f8f8dc28SDmitry Kozlyuk 
60f8f8dc28SDmitry Kozlyuk 	/* opaque pointer */
61f8f8dc28SDmitry Kozlyuk 	void *opaque;
62f8f8dc28SDmitry Kozlyuk };
63f8f8dc28SDmitry Kozlyuk 
6499a2dd95SBruce Richardson #ifdef RTE_EXEC_ENV_WINDOWS
6599a2dd95SBruce Richardson struct terminal {
6699a2dd95SBruce Richardson 	DWORD input_mode;
6799a2dd95SBruce Richardson 	DWORD output_mode;
6899a2dd95SBruce Richardson 	int is_console_input;
6999a2dd95SBruce Richardson 	int is_console_output;
7099a2dd95SBruce Richardson };
71f43809d2SDmitry Kozlyuk #endif
7299a2dd95SBruce Richardson 
7399a2dd95SBruce Richardson struct cmdline {
7499a2dd95SBruce Richardson 	int s_in;
7599a2dd95SBruce Richardson 	int s_out;
7699a2dd95SBruce Richardson 	cmdline_parse_ctx_t *ctx;
7799a2dd95SBruce Richardson 	struct rdline rdl;
7899a2dd95SBruce Richardson 	char prompt[RDLINE_PROMPT_SIZE];
79f43809d2SDmitry Kozlyuk #ifdef RTE_EXEC_ENV_WINDOWS
8099a2dd95SBruce Richardson 	struct terminal oldterm;
8199a2dd95SBruce Richardson 	char repeated_char;
8299a2dd95SBruce Richardson 	WORD repeat_count;
83f43809d2SDmitry Kozlyuk #else
84f43809d2SDmitry Kozlyuk 	struct termios oldterm;
8599a2dd95SBruce Richardson #endif
86f43809d2SDmitry Kozlyuk };
8799a2dd95SBruce Richardson 
8899a2dd95SBruce Richardson /* Disable buffering and echoing, save previous settings to oldterm. */
8999a2dd95SBruce Richardson void terminal_adjust(struct cmdline *cl);
9099a2dd95SBruce Richardson 
9199a2dd95SBruce Richardson /* Restore terminal settings form oldterm. */
9299a2dd95SBruce Richardson void terminal_restore(const struct cmdline *cl);
9399a2dd95SBruce Richardson 
9499a2dd95SBruce Richardson /* Read one character from input. */
9599a2dd95SBruce Richardson ssize_t cmdline_read_char(struct cmdline *cl, char *c);
9699a2dd95SBruce Richardson 
97f1d0993eSStephen Hemminger /* Force current cmdline read to unblock. */
98f1d0993eSStephen Hemminger void cmdline_cancel(struct cmdline *cl);
99f1d0993eSStephen Hemminger 
10099a2dd95SBruce Richardson /* vdprintf(3) */
10199a2dd95SBruce Richardson __rte_format_printf(2, 0)
10299a2dd95SBruce Richardson int cmdline_vdprintf(int fd, const char *format, va_list op);
10399a2dd95SBruce Richardson 
104f8f8dc28SDmitry Kozlyuk int rdline_init(struct rdline *rdl,
105f8f8dc28SDmitry Kozlyuk 		rdline_write_char_t *write_char,
106f8f8dc28SDmitry Kozlyuk 		rdline_validate_t *validate,
107f8f8dc28SDmitry Kozlyuk 		rdline_complete_t *complete,
108f8f8dc28SDmitry Kozlyuk 		void *opaque);
109f8f8dc28SDmitry Kozlyuk 
11099a2dd95SBruce Richardson #endif
111