Lines Matching +full:rs +full:-

4  * Copyright (c) 2003-2004 Fabrice Bellard
35 void readline_show_prompt(ReadLineState *rs) in readline_show_prompt() argument
37 rs->printf_func(rs->opaque, "%s", rs->prompt); in readline_show_prompt()
38 rs->flush_func(rs->opaque); in readline_show_prompt()
39 rs->last_cmd_buf_index = 0; in readline_show_prompt()
40 rs->last_cmd_buf_size = 0; in readline_show_prompt()
41 rs->esc_state = IS_NORM; in readline_show_prompt()
45 static void readline_update(ReadLineState *rs) in readline_update() argument
49 if (rs->cmd_buf_size != rs->last_cmd_buf_size || in readline_update()
50 memcmp(rs->cmd_buf, rs->last_cmd_buf, rs->cmd_buf_size) != 0) { in readline_update()
51 for (i = 0; i < rs->last_cmd_buf_index; i++) { in readline_update()
52 rs->printf_func(rs->opaque, "\033[D"); in readline_update()
54 rs->cmd_buf[rs->cmd_buf_size] = '\0'; in readline_update()
55 if (rs->read_password) { in readline_update()
56 len = strlen(rs->cmd_buf); in readline_update()
58 rs->printf_func(rs->opaque, "*"); in readline_update()
61 rs->printf_func(rs->opaque, "%s", rs->cmd_buf); in readline_update()
63 rs->printf_func(rs->opaque, "\033[K"); in readline_update()
64 memcpy(rs->last_cmd_buf, rs->cmd_buf, rs->cmd_buf_size); in readline_update()
65 rs->last_cmd_buf_size = rs->cmd_buf_size; in readline_update()
66 rs->last_cmd_buf_index = rs->cmd_buf_size; in readline_update()
68 if (rs->cmd_buf_index != rs->last_cmd_buf_index) { in readline_update()
69 delta = rs->cmd_buf_index - rs->last_cmd_buf_index; in readline_update()
72 rs->printf_func(rs->opaque, "\033[C"); in readline_update()
75 delta = -delta; in readline_update()
77 rs->printf_func(rs->opaque, "\033[D"); in readline_update()
80 rs->last_cmd_buf_index = rs->cmd_buf_index; in readline_update()
82 rs->flush_func(rs->opaque); in readline_update()
85 static void readline_insert_char(ReadLineState *rs, int ch) in readline_insert_char() argument
87 if (rs->cmd_buf_index < READLINE_CMD_BUF_SIZE) { in readline_insert_char()
88 memmove(rs->cmd_buf + rs->cmd_buf_index + 1, in readline_insert_char()
89 rs->cmd_buf + rs->cmd_buf_index, in readline_insert_char()
90 rs->cmd_buf_size - rs->cmd_buf_index); in readline_insert_char()
91 rs->cmd_buf[rs->cmd_buf_index] = ch; in readline_insert_char()
92 rs->cmd_buf_size++; in readline_insert_char()
93 rs->cmd_buf_index++; in readline_insert_char()
97 static void readline_backward_char(ReadLineState *rs) in readline_backward_char() argument
99 if (rs->cmd_buf_index > 0) { in readline_backward_char()
100 rs->cmd_buf_index--; in readline_backward_char()
104 static void readline_forward_char(ReadLineState *rs) in readline_forward_char() argument
106 if (rs->cmd_buf_index < rs->cmd_buf_size) { in readline_forward_char()
107 rs->cmd_buf_index++; in readline_forward_char()
111 static void readline_delete_char(ReadLineState *rs) in readline_delete_char() argument
113 if (rs->cmd_buf_index < rs->cmd_buf_size) { in readline_delete_char()
114 memmove(rs->cmd_buf + rs->cmd_buf_index, in readline_delete_char()
115 rs->cmd_buf + rs->cmd_buf_index + 1, in readline_delete_char()
116 rs->cmd_buf_size - rs->cmd_buf_index - 1); in readline_delete_char()
117 rs->cmd_buf_size--; in readline_delete_char()
121 static void readline_backspace(ReadLineState *rs) in readline_backspace() argument
123 if (rs->cmd_buf_index > 0) { in readline_backspace()
124 readline_backward_char(rs); in readline_backspace()
125 readline_delete_char(rs); in readline_backspace()
129 static void readline_backword(ReadLineState *rs) in readline_backword() argument
133 if (rs->cmd_buf_index == 0 || rs->cmd_buf_index > rs->cmd_buf_size) { in readline_backword()
137 start = rs->cmd_buf_index - 1; in readline_backword()
141 if (!qemu_isspace(rs->cmd_buf[start])) { in readline_backword()
145 --start; in readline_backword()
150 if (qemu_isspace(rs->cmd_buf[start])) { in readline_backword()
155 --start; in readline_backword()
159 if (start < rs->cmd_buf_index) { in readline_backword()
160 memmove(rs->cmd_buf + start, in readline_backword()
161 rs->cmd_buf + rs->cmd_buf_index, in readline_backword()
162 rs->cmd_buf_size - rs->cmd_buf_index); in readline_backword()
163 rs->cmd_buf_size -= rs->cmd_buf_index - start; in readline_backword()
164 rs->cmd_buf_index = start; in readline_backword()
168 static void readline_bol(ReadLineState *rs) in readline_bol() argument
170 rs->cmd_buf_index = 0; in readline_bol()
173 static void readline_eol(ReadLineState *rs) in readline_eol() argument
175 rs->cmd_buf_index = rs->cmd_buf_size; in readline_eol()
178 static void readline_up_char(ReadLineState *rs) in readline_up_char() argument
182 if (rs->hist_entry == 0) { in readline_up_char()
185 if (rs->hist_entry == -1) { in readline_up_char()
188 if (rs->history[idx] == NULL) { in readline_up_char()
192 rs->hist_entry = idx; in readline_up_char()
194 rs->hist_entry--; in readline_up_char()
195 if (rs->hist_entry >= 0) { in readline_up_char()
196 pstrcpy(rs->cmd_buf, sizeof(rs->cmd_buf), in readline_up_char()
197 rs->history[rs->hist_entry]); in readline_up_char()
198 rs->cmd_buf_index = rs->cmd_buf_size = strlen(rs->cmd_buf); in readline_up_char()
202 static void readline_down_char(ReadLineState *rs) in readline_down_char() argument
204 if (rs->hist_entry == -1) { in readline_down_char()
207 if (rs->hist_entry < READLINE_MAX_CMDS - 1 && in readline_down_char()
208 rs->history[++rs->hist_entry] != NULL) { in readline_down_char()
209 pstrcpy(rs->cmd_buf, sizeof(rs->cmd_buf), in readline_down_char()
210 rs->history[rs->hist_entry]); in readline_down_char()
212 rs->cmd_buf[0] = 0; in readline_down_char()
213 rs->hist_entry = -1; in readline_down_char()
215 rs->cmd_buf_index = rs->cmd_buf_size = strlen(rs->cmd_buf); in readline_down_char()
218 static void readline_hist_add(ReadLineState *rs, const char *cmdline) in readline_hist_add() argument
227 if (rs->hist_entry != -1) { in readline_hist_add()
229 hist_entry = rs->history[rs->hist_entry]; in readline_hist_add()
230 idx = rs->hist_entry; in readline_hist_add()
237 hist_entry = rs->history[idx]; in readline_hist_add()
243 if (idx == READLINE_MAX_CMDS - 1) { in readline_hist_add()
248 memmove(&rs->history[idx], &rs->history[idx + 1], in readline_hist_add()
249 (READLINE_MAX_CMDS - (idx + 1)) * sizeof(char *)); in readline_hist_add()
250 rs->history[READLINE_MAX_CMDS - 1] = NULL; in readline_hist_add()
252 if (rs->history[idx] == NULL) { in readline_hist_add()
261 g_free(rs->history[0]); in readline_hist_add()
262 memmove(rs->history, &rs->history[1], in readline_hist_add()
263 (READLINE_MAX_CMDS - 1) * sizeof(char *)); in readline_hist_add()
264 rs->history[READLINE_MAX_CMDS - 1] = NULL; in readline_hist_add()
265 idx = READLINE_MAX_CMDS - 1; in readline_hist_add()
270 rs->history[idx] = new_entry; in readline_hist_add()
271 rs->hist_entry = -1; in readline_hist_add()
274 static void readline_kill_line(ReadLineState *rs) in readline_kill_line() argument
276 while (rs->cmd_buf_index > 0) { in readline_kill_line()
277 readline_backward_char(rs); in readline_kill_line()
278 readline_delete_char(rs); in readline_kill_line()
284 void readline_add_completion(ReadLineState *rs, const char *str) in readline_add_completion() argument
286 if (rs->nb_completions < READLINE_MAX_COMPLETIONS) { in readline_add_completion()
288 for (i = 0; i < rs->nb_completions; i++) { in readline_add_completion()
289 if (!strcmp(rs->completions[i], str)) { in readline_add_completion()
293 rs->completions[rs->nb_completions++] = g_strdup(str); in readline_add_completion()
297 void readline_add_completion_of(ReadLineState *rs, in readline_add_completion_of() argument
301 readline_add_completion(rs, str); in readline_add_completion_of()
305 void readline_set_completion_index(ReadLineState *rs, int index) in readline_set_completion_index() argument
307 rs->completion_index = index; in readline_set_completion_index()
315 static void readline_completion(ReadLineState *rs) in readline_completion() argument
320 rs->nb_completions = 0; in readline_completion()
322 cmdline = g_strndup(rs->cmd_buf, rs->cmd_buf_index); in readline_completion()
323 rs->completion_finder(rs->opaque, cmdline); in readline_completion()
327 if (rs->nb_completions <= 0) { in readline_completion()
330 if (rs->nb_completions == 1) { in readline_completion()
331 len = strlen(rs->completions[0]); in readline_completion()
332 for (i = rs->completion_index; i < len; i++) { in readline_completion()
333 readline_insert_char(rs, rs->completions[0][i]); in readline_completion()
336 if (len > 0 && rs->completions[0][len - 1] != '/') { in readline_completion()
337 readline_insert_char(rs, ' '); in readline_completion()
340 qsort(rs->completions, rs->nb_completions, sizeof(char *), in readline_completion()
342 rs->printf_func(rs->opaque, "\n"); in readline_completion()
345 for (i = 0; i < rs->nb_completions; i++) { in readline_completion()
346 len = strlen(rs->completions[i]); in readline_completion()
354 if (rs->completions[i][j] != rs->completions[0][j]) { in readline_completion()
364 for (i = rs->completion_index; i < max_prefix; i++) { in readline_completion()
365 readline_insert_char(rs, rs->completions[0][i]); in readline_completion()
375 for (i = 0; i < rs->nb_completions; i++) { in readline_completion()
376 rs->printf_func(rs->opaque, "%-*s", max_width, rs->completions[i]); in readline_completion()
377 if (++j == nb_cols || i == (rs->nb_completions - 1)) { in readline_completion()
378 rs->printf_func(rs->opaque, "\n"); in readline_completion()
382 readline_show_prompt(rs); in readline_completion()
384 for (i = 0; i < rs->nb_completions; i++) { in readline_completion()
385 g_free(rs->completions[i]); in readline_completion()
389 static void readline_clear_screen(ReadLineState *rs) in readline_clear_screen() argument
391 rs->printf_func(rs->opaque, "\033[2J\033[1;1H"); in readline_clear_screen()
392 readline_show_prompt(rs); in readline_clear_screen()
396 void readline_handle_byte(ReadLineState *rs, int ch) in readline_handle_byte() argument
398 switch (rs->esc_state) { in readline_handle_byte()
402 readline_bol(rs); in readline_handle_byte()
405 readline_delete_char(rs); in readline_handle_byte()
408 readline_eol(rs); in readline_handle_byte()
411 readline_completion(rs); in readline_handle_byte()
414 readline_clear_screen(rs); in readline_handle_byte()
418 rs->cmd_buf[rs->cmd_buf_size] = '\0'; in readline_handle_byte()
419 if (!rs->read_password) { in readline_handle_byte()
420 readline_hist_add(rs, rs->cmd_buf); in readline_handle_byte()
422 rs->printf_func(rs->opaque, "\n"); in readline_handle_byte()
423 rs->cmd_buf_index = 0; in readline_handle_byte()
424 rs->cmd_buf_size = 0; in readline_handle_byte()
425 rs->last_cmd_buf_index = 0; in readline_handle_byte()
426 rs->last_cmd_buf_size = 0; in readline_handle_byte()
427 rs->readline_func(rs->opaque, rs->cmd_buf, rs->readline_opaque); in readline_handle_byte()
431 readline_down_char(rs); in readline_handle_byte()
435 readline_up_char(rs); in readline_handle_byte()
439 readline_kill_line(rs); in readline_handle_byte()
443 readline_backword(rs); in readline_handle_byte()
446 rs->esc_state = IS_ESC; in readline_handle_byte()
450 readline_backspace(rs); in readline_handle_byte()
453 rs->esc_state = IS_CSI; in readline_handle_byte()
457 readline_insert_char(rs, ch); in readline_handle_byte()
464 rs->esc_state = IS_CSI; in readline_handle_byte()
465 rs->esc_param = 0; in readline_handle_byte()
467 rs->esc_state = IS_SS3; in readline_handle_byte()
468 rs->esc_param = 0; in readline_handle_byte()
470 rs->esc_state = IS_NORM; in readline_handle_byte()
477 readline_up_char(rs); in readline_handle_byte()
481 readline_down_char(rs); in readline_handle_byte()
484 readline_backward_char(rs); in readline_handle_byte()
487 readline_forward_char(rs); in readline_handle_byte()
490 rs->esc_param = rs->esc_param * 10 + (ch - '0'); in readline_handle_byte()
493 switch (rs->esc_param) { in readline_handle_byte()
495 readline_bol(rs); in readline_handle_byte()
498 readline_delete_char(rs); in readline_handle_byte()
501 readline_eol(rs); in readline_handle_byte()
510 rs->esc_state = IS_NORM; in readline_handle_byte()
517 readline_eol(rs); in readline_handle_byte()
520 readline_bol(rs); in readline_handle_byte()
525 rs->esc_state = IS_NORM; in readline_handle_byte()
530 readline_update(rs); in readline_handle_byte()
533 void readline_start(ReadLineState *rs, const char *prompt, int read_password, in readline_start() argument
536 pstrcpy(rs->prompt, sizeof(rs->prompt), prompt); in readline_start()
537 rs->readline_func = readline_func; in readline_start()
538 rs->readline_opaque = opaque; in readline_start()
539 rs->read_password = read_password; in readline_start()
540 readline_restart(rs); in readline_start()
543 void readline_restart(ReadLineState *rs) in readline_restart() argument
545 rs->cmd_buf_index = 0; in readline_restart()
546 rs->cmd_buf_size = 0; in readline_restart()
549 const char *readline_get_history(ReadLineState *rs, unsigned int index) in readline_get_history() argument
554 return rs->history[index]; in readline_get_history()
557 void readline_free(ReadLineState *rs) in readline_free() argument
561 if (!rs) { in readline_free()
565 g_free(rs->history[i]); in readline_free()
567 g_free(rs); in readline_free()
575 ReadLineState *rs = g_new0(ReadLineState, 1); in readline_init() local
577 rs->hist_entry = -1; in readline_init()
578 rs->opaque = opaque; in readline_init()
579 rs->printf_func = printf_func; in readline_init()
580 rs->flush_func = flush_func; in readline_init()
581 rs->completion_finder = completion_finder; in readline_init()
583 return rs; in readline_init()