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