1 /* radare - LGPL - Copyright 2007-2019 - pancake */
2
3 #include <r_util.h>
4 #include <r_cons.h>
5
6 static RLine r_line_instance;
7 #define I r_line_instance
8
r_line_singleton(void)9 R_API RLine *r_line_singleton(void) {
10 return &r_line_instance;
11 }
12
r_line_new(void)13 R_API RLine *r_line_new(void) {
14 I.hist_up = NULL;
15 I.hist_down = NULL;
16 I.prompt = strdup ("> ");
17 I.contents = NULL;
18 I.enable_vi_mode = false;
19 I.clipboard = NULL;
20 I.kill_ring = r_list_newf (NULL);
21 I.kill_ring_ptr = -1;
22 #if __WINDOWS__
23 I.vtmode = r_cons_is_vtcompat ();
24 #else
25 I.vtmode = 2;
26 #endif
27 if (!r_line_dietline_init ()) {
28 eprintf ("error: r_line_dietline_init\n");
29 }
30 r_line_completion_init (&I.completion, 4096);
31 return &I;
32 }
33
r_line_free(void)34 R_API void r_line_free(void) {
35 // XXX: prompt out of the heap?
36 free ((void *)I.prompt);
37 I.prompt = NULL;
38 r_list_free (I.kill_ring);
39 r_line_hist_free ();
40 r_line_completion_fini (&I.completion);
41 }
42
r_line_clipboard_push(const char * str)43 R_API void r_line_clipboard_push (const char *str) {
44 I.kill_ring_ptr += 1;
45 r_list_insert (I.kill_ring, I.kill_ring_ptr, strdup (str));
46 }
47
48 // handle const or dynamic prompts?
r_line_set_prompt(const char * prompt)49 R_API void r_line_set_prompt(const char *prompt) {
50 free (I.prompt);
51 I.prompt = strdup (prompt);
52 RCons *cons = r_cons_singleton ();
53 I.cb_fkey = cons->cb_fkey;
54 }
55
56 // handle const or dynamic prompts?
r_line_get_prompt(void)57 R_API char *r_line_get_prompt(void) {
58 return strdup (I.prompt);
59 }
60
r_line_completion_init(RLineCompletion * completion,size_t args_limit)61 R_API void r_line_completion_init(RLineCompletion *completion, size_t args_limit) {
62 completion->run = NULL;
63 completion->run_user = NULL;
64 completion->args_limit = args_limit;
65 r_pvector_init (&completion->args, free);
66 }
67
r_line_completion_fini(RLineCompletion * completion)68 R_API void r_line_completion_fini(RLineCompletion *completion) {
69 r_line_completion_clear (completion);
70 }
71
r_line_completion_push(RLineCompletion * completion,const char * str)72 R_API void r_line_completion_push(RLineCompletion *completion, const char *str) {
73 r_return_if_fail (completion && str);
74 if (completion->quit) {
75 return;
76 }
77 if (r_pvector_len (&completion->args) < completion->args_limit) {
78 char *s = strdup (str);
79 if (s) {
80 r_pvector_push (&completion->args, (void *)s);
81 }
82 } else {
83 completion->quit = true;
84 eprintf ("WARNING: Maximum completion capacity reached, increase scr.maxtab");
85 }
86 }
87
r_line_completion_set(RLineCompletion * completion,int argc,const char ** argv)88 R_API void r_line_completion_set(RLineCompletion *completion, int argc, const char **argv) {
89 r_return_if_fail (completion && (argc >= 0));
90 r_line_completion_clear (completion);
91 if (argc > completion->args_limit) {
92 eprintf ("WARNING: Maximum completion capacity reached, increase scr.maxtab");
93 }
94 size_t count = R_MIN (argc, completion->args_limit);
95 r_pvector_reserve (&completion->args, count);
96 int i;
97 for (i = 0; i < count; i++) {
98 r_line_completion_push (completion, argv[i]);
99 }
100 }
101
r_line_completion_clear(RLineCompletion * completion)102 R_API void r_line_completion_clear(RLineCompletion *completion) {
103 r_return_if_fail (completion);
104 completion->quit = false;
105 r_pvector_clear (&completion->args);
106 }
107
108 #include "dietline.c"
109