Revision c60bf339 readline.c
b/readline.c | ||
---|---|---|
21 | 21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 |
|
|
25 |
#include "qemu-common.h" |
|
24 | 26 |
#include "monitor/readline.h" |
25 |
#include "monitor/monitor.h" |
|
26 | 27 |
|
27 | 28 |
#define IS_NORM 0 |
28 | 29 |
#define IS_ESC 1 |
29 | 30 |
#define IS_CSI 2 |
30 | 31 |
#define IS_SS3 3 |
31 | 32 |
|
32 |
#undef printf |
|
33 |
#define printf do_not_use_printf |
|
34 |
|
|
35 | 33 |
void readline_show_prompt(ReadLineState *rs) |
36 | 34 |
{ |
37 |
monitor_printf(rs->mon, "%s", rs->prompt);
|
|
38 |
monitor_flush(rs->mon);
|
|
35 |
rs->printf_func(rs->opaque, "%s", rs->prompt);
|
|
36 |
rs->flush_func(rs->opaque);
|
|
39 | 37 |
rs->last_cmd_buf_index = 0; |
40 | 38 |
rs->last_cmd_buf_size = 0; |
41 | 39 |
rs->esc_state = IS_NORM; |
... | ... | |
49 | 47 |
if (rs->cmd_buf_size != rs->last_cmd_buf_size || |
50 | 48 |
memcmp(rs->cmd_buf, rs->last_cmd_buf, rs->cmd_buf_size) != 0) { |
51 | 49 |
for(i = 0; i < rs->last_cmd_buf_index; i++) { |
52 |
monitor_printf(rs->mon, "\033[D");
|
|
50 |
rs->printf_func(rs->opaque, "\033[D");
|
|
53 | 51 |
} |
54 | 52 |
rs->cmd_buf[rs->cmd_buf_size] = '\0'; |
55 | 53 |
if (rs->read_password) { |
56 | 54 |
len = strlen(rs->cmd_buf); |
57 | 55 |
for(i = 0; i < len; i++) |
58 |
monitor_printf(rs->mon, "*");
|
|
56 |
rs->printf_func(rs->opaque, "*");
|
|
59 | 57 |
} else { |
60 |
monitor_printf(rs->mon, "%s", rs->cmd_buf);
|
|
58 |
rs->printf_func(rs->opaque, "%s", rs->cmd_buf);
|
|
61 | 59 |
} |
62 |
monitor_printf(rs->mon, "\033[K");
|
|
60 |
rs->printf_func(rs->opaque, "\033[K");
|
|
63 | 61 |
memcpy(rs->last_cmd_buf, rs->cmd_buf, rs->cmd_buf_size); |
64 | 62 |
rs->last_cmd_buf_size = rs->cmd_buf_size; |
65 | 63 |
rs->last_cmd_buf_index = rs->cmd_buf_size; |
... | ... | |
68 | 66 |
delta = rs->cmd_buf_index - rs->last_cmd_buf_index; |
69 | 67 |
if (delta > 0) { |
70 | 68 |
for(i = 0;i < delta; i++) { |
71 |
monitor_printf(rs->mon, "\033[C");
|
|
69 |
rs->printf_func(rs->opaque, "\033[C");
|
|
72 | 70 |
} |
73 | 71 |
} else { |
74 | 72 |
delta = -delta; |
75 | 73 |
for(i = 0;i < delta; i++) { |
76 |
monitor_printf(rs->mon, "\033[D");
|
|
74 |
rs->printf_func(rs->opaque, "\033[D");
|
|
77 | 75 |
} |
78 | 76 |
} |
79 | 77 |
rs->last_cmd_buf_index = rs->cmd_buf_index; |
80 | 78 |
} |
81 |
monitor_flush(rs->mon);
|
|
79 |
rs->flush_func(rs->opaque);
|
|
82 | 80 |
} |
83 | 81 |
|
84 | 82 |
static void readline_insert_char(ReadLineState *rs, int ch) |
... | ... | |
284 | 282 |
cmdline = g_malloc(rs->cmd_buf_index + 1); |
285 | 283 |
memcpy(cmdline, rs->cmd_buf, rs->cmd_buf_index); |
286 | 284 |
cmdline[rs->cmd_buf_index] = '\0'; |
287 |
rs->completion_finder(rs->mon, cmdline);
|
|
285 |
rs->completion_finder(rs->opaque, cmdline);
|
|
288 | 286 |
g_free(cmdline); |
289 | 287 |
|
290 | 288 |
/* no completion found */ |
... | ... | |
299 | 297 |
if (len > 0 && rs->completions[0][len - 1] != '/') |
300 | 298 |
readline_insert_char(rs, ' '); |
301 | 299 |
} else { |
302 |
monitor_printf(rs->mon, "\n");
|
|
300 |
rs->printf_func(rs->opaque, "\n");
|
|
303 | 301 |
max_width = 0; |
304 | 302 |
max_prefix = 0; |
305 | 303 |
for(i = 0; i < rs->nb_completions; i++) { |
... | ... | |
329 | 327 |
nb_cols = 80 / max_width; |
330 | 328 |
j = 0; |
331 | 329 |
for(i = 0; i < rs->nb_completions; i++) { |
332 |
monitor_printf(rs->mon, "%-*s", max_width, rs->completions[i]);
|
|
330 |
rs->printf_func(rs->opaque, "%-*s", max_width, rs->completions[i]);
|
|
333 | 331 |
if (++j == nb_cols || i == (rs->nb_completions - 1)) { |
334 |
monitor_printf(rs->mon, "\n");
|
|
332 |
rs->printf_func(rs->opaque, "\n");
|
|
335 | 333 |
j = 0; |
336 | 334 |
} |
337 | 335 |
} |
... | ... | |
365 | 363 |
rs->cmd_buf[rs->cmd_buf_size] = '\0'; |
366 | 364 |
if (!rs->read_password) |
367 | 365 |
readline_hist_add(rs, rs->cmd_buf); |
368 |
monitor_printf(rs->mon, "\n");
|
|
366 |
rs->printf_func(rs->opaque, "\n");
|
|
369 | 367 |
rs->cmd_buf_index = 0; |
370 | 368 |
rs->cmd_buf_size = 0; |
371 | 369 |
rs->last_cmd_buf_index = 0; |
372 | 370 |
rs->last_cmd_buf_size = 0; |
373 |
rs->readline_func(rs->mon, rs->cmd_buf, rs->readline_opaque);
|
|
371 |
rs->readline_func(rs->opaque, rs->cmd_buf, rs->readline_opaque);
|
|
374 | 372 |
break; |
375 | 373 |
case 23: |
376 | 374 |
/* ^W */ |
... | ... | |
480 | 478 |
return rs->history[index]; |
481 | 479 |
} |
482 | 480 |
|
483 |
ReadLineState *readline_init(Monitor *mon, |
|
481 |
ReadLineState *readline_init(ReadLinePrintfFunc *printf_func, |
|
482 |
ReadLineFlushFunc *flush_func, |
|
483 |
void *opaque, |
|
484 | 484 |
ReadLineCompletionFunc *completion_finder) |
485 | 485 |
{ |
486 | 486 |
ReadLineState *rs = g_malloc0(sizeof(*rs)); |
487 | 487 |
|
488 | 488 |
rs->hist_entry = -1; |
489 |
rs->mon = mon; |
|
489 |
rs->opaque = opaque; |
|
490 |
rs->printf_func = printf_func; |
|
491 |
rs->flush_func = flush_func; |
|
490 | 492 |
rs->completion_finder = completion_finder; |
491 | 493 |
|
492 | 494 |
return rs; |
Also available in: Unified diff