xref: /freebsd/contrib/libedit/prompt.c (revision 61c1328eb016476ee7ff5ad65d8224bb43e572db)
1*d0ef721eSBaptiste Daroussin /*	$NetBSD: prompt.c,v 1.27 2017/06/27 23:25:13 christos Exp $	*/
2*d0ef721eSBaptiste Daroussin 
3*d0ef721eSBaptiste Daroussin /*-
4*d0ef721eSBaptiste Daroussin  * Copyright (c) 1992, 1993
5*d0ef721eSBaptiste Daroussin  *	The Regents of the University of California.  All rights reserved.
6*d0ef721eSBaptiste Daroussin  *
7*d0ef721eSBaptiste Daroussin  * This code is derived from software contributed to Berkeley by
8*d0ef721eSBaptiste Daroussin  * Christos Zoulas of Cornell University.
9*d0ef721eSBaptiste Daroussin  *
10*d0ef721eSBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
11*d0ef721eSBaptiste Daroussin  * modification, are permitted provided that the following conditions
12*d0ef721eSBaptiste Daroussin  * are met:
13*d0ef721eSBaptiste Daroussin  * 1. Redistributions of source code must retain the above copyright
14*d0ef721eSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer.
15*d0ef721eSBaptiste Daroussin  * 2. Redistributions in binary form must reproduce the above copyright
16*d0ef721eSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer in the
17*d0ef721eSBaptiste Daroussin  *    documentation and/or other materials provided with the distribution.
18*d0ef721eSBaptiste Daroussin  * 3. Neither the name of the University nor the names of its contributors
19*d0ef721eSBaptiste Daroussin  *    may be used to endorse or promote products derived from this software
20*d0ef721eSBaptiste Daroussin  *    without specific prior written permission.
21*d0ef721eSBaptiste Daroussin  *
22*d0ef721eSBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23*d0ef721eSBaptiste Daroussin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24*d0ef721eSBaptiste Daroussin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*d0ef721eSBaptiste Daroussin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26*d0ef721eSBaptiste Daroussin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27*d0ef721eSBaptiste Daroussin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28*d0ef721eSBaptiste Daroussin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29*d0ef721eSBaptiste Daroussin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30*d0ef721eSBaptiste Daroussin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31*d0ef721eSBaptiste Daroussin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*d0ef721eSBaptiste Daroussin  * SUCH DAMAGE.
33*d0ef721eSBaptiste Daroussin  */
34*d0ef721eSBaptiste Daroussin 
35*d0ef721eSBaptiste Daroussin #include "config.h"
36*d0ef721eSBaptiste Daroussin #if !defined(lint) && !defined(SCCSID)
37*d0ef721eSBaptiste Daroussin #if 0
38*d0ef721eSBaptiste Daroussin static char sccsid[] = "@(#)prompt.c	8.1 (Berkeley) 6/4/93";
39*d0ef721eSBaptiste Daroussin #else
40*d0ef721eSBaptiste Daroussin __RCSID("$NetBSD: prompt.c,v 1.27 2017/06/27 23:25:13 christos Exp $");
41*d0ef721eSBaptiste Daroussin #endif
42*d0ef721eSBaptiste Daroussin #endif /* not lint && not SCCSID */
43*d0ef721eSBaptiste Daroussin 
44*d0ef721eSBaptiste Daroussin /*
45*d0ef721eSBaptiste Daroussin  * prompt.c: Prompt printing functions
46*d0ef721eSBaptiste Daroussin  */
47*d0ef721eSBaptiste Daroussin #include <stdio.h>
48*d0ef721eSBaptiste Daroussin #include "el.h"
49*d0ef721eSBaptiste Daroussin 
50*d0ef721eSBaptiste Daroussin static wchar_t	*prompt_default(EditLine *);
51*d0ef721eSBaptiste Daroussin static wchar_t	*prompt_default_r(EditLine *);
52*d0ef721eSBaptiste Daroussin 
53*d0ef721eSBaptiste Daroussin /* prompt_default():
54*d0ef721eSBaptiste Daroussin  *	Just a default prompt, in case the user did not provide one
55*d0ef721eSBaptiste Daroussin  */
56*d0ef721eSBaptiste Daroussin static wchar_t *
57*d0ef721eSBaptiste Daroussin /*ARGSUSED*/
prompt_default(EditLine * el)58*d0ef721eSBaptiste Daroussin prompt_default(EditLine *el __attribute__((__unused__)))
59*d0ef721eSBaptiste Daroussin {
60*d0ef721eSBaptiste Daroussin 	static wchar_t a[3] = L"? ";
61*d0ef721eSBaptiste Daroussin 
62*d0ef721eSBaptiste Daroussin 	return a;
63*d0ef721eSBaptiste Daroussin }
64*d0ef721eSBaptiste Daroussin 
65*d0ef721eSBaptiste Daroussin 
66*d0ef721eSBaptiste Daroussin /* prompt_default_r():
67*d0ef721eSBaptiste Daroussin  *	Just a default rprompt, in case the user did not provide one
68*d0ef721eSBaptiste Daroussin  */
69*d0ef721eSBaptiste Daroussin static wchar_t *
70*d0ef721eSBaptiste Daroussin /*ARGSUSED*/
prompt_default_r(EditLine * el)71*d0ef721eSBaptiste Daroussin prompt_default_r(EditLine *el __attribute__((__unused__)))
72*d0ef721eSBaptiste Daroussin {
73*d0ef721eSBaptiste Daroussin 	static wchar_t a[1] = L"";
74*d0ef721eSBaptiste Daroussin 
75*d0ef721eSBaptiste Daroussin 	return a;
76*d0ef721eSBaptiste Daroussin }
77*d0ef721eSBaptiste Daroussin 
78*d0ef721eSBaptiste Daroussin 
79*d0ef721eSBaptiste Daroussin /* prompt_print():
80*d0ef721eSBaptiste Daroussin  *	Print the prompt and update the prompt position.
81*d0ef721eSBaptiste Daroussin  */
82*d0ef721eSBaptiste Daroussin libedit_private void
prompt_print(EditLine * el,int op)83*d0ef721eSBaptiste Daroussin prompt_print(EditLine *el, int op)
84*d0ef721eSBaptiste Daroussin {
85*d0ef721eSBaptiste Daroussin 	el_prompt_t *elp;
86*d0ef721eSBaptiste Daroussin 	wchar_t *p;
87*d0ef721eSBaptiste Daroussin 
88*d0ef721eSBaptiste Daroussin 	if (op == EL_PROMPT)
89*d0ef721eSBaptiste Daroussin 		elp = &el->el_prompt;
90*d0ef721eSBaptiste Daroussin 	else
91*d0ef721eSBaptiste Daroussin 		elp = &el->el_rprompt;
92*d0ef721eSBaptiste Daroussin 
93*d0ef721eSBaptiste Daroussin 	if (elp->p_wide)
94*d0ef721eSBaptiste Daroussin 		p = (*elp->p_func)(el);
95*d0ef721eSBaptiste Daroussin 	else
96*d0ef721eSBaptiste Daroussin 		p = ct_decode_string((char *)(void *)(*elp->p_func)(el),
97*d0ef721eSBaptiste Daroussin 		    &el->el_scratch);
98*d0ef721eSBaptiste Daroussin 
99*d0ef721eSBaptiste Daroussin 	for (; *p; p++) {
100*d0ef721eSBaptiste Daroussin 		if (elp->p_ignore == *p) {
101*d0ef721eSBaptiste Daroussin 			wchar_t *litstart = ++p;
102*d0ef721eSBaptiste Daroussin 			while (*p && *p != elp->p_ignore)
103*d0ef721eSBaptiste Daroussin 				p++;
104*d0ef721eSBaptiste Daroussin 			if (!*p || !p[1]) {
105*d0ef721eSBaptiste Daroussin 				// XXX: We lose the last literal
106*d0ef721eSBaptiste Daroussin 				break;
107*d0ef721eSBaptiste Daroussin 			}
108*d0ef721eSBaptiste Daroussin 			re_putliteral(el, litstart, p++);
109*d0ef721eSBaptiste Daroussin 			continue;
110*d0ef721eSBaptiste Daroussin 		}
111*d0ef721eSBaptiste Daroussin 		re_putc(el, *p, 1);
112*d0ef721eSBaptiste Daroussin 	}
113*d0ef721eSBaptiste Daroussin 
114*d0ef721eSBaptiste Daroussin 	elp->p_pos.v = el->el_refresh.r_cursor.v;
115*d0ef721eSBaptiste Daroussin 	elp->p_pos.h = el->el_refresh.r_cursor.h;
116*d0ef721eSBaptiste Daroussin }
117*d0ef721eSBaptiste Daroussin 
118*d0ef721eSBaptiste Daroussin 
119*d0ef721eSBaptiste Daroussin /* prompt_init():
120*d0ef721eSBaptiste Daroussin  *	Initialize the prompt stuff
121*d0ef721eSBaptiste Daroussin  */
122*d0ef721eSBaptiste Daroussin libedit_private int
prompt_init(EditLine * el)123*d0ef721eSBaptiste Daroussin prompt_init(EditLine *el)
124*d0ef721eSBaptiste Daroussin {
125*d0ef721eSBaptiste Daroussin 
126*d0ef721eSBaptiste Daroussin 	el->el_prompt.p_func = prompt_default;
127*d0ef721eSBaptiste Daroussin 	el->el_prompt.p_pos.v = 0;
128*d0ef721eSBaptiste Daroussin 	el->el_prompt.p_pos.h = 0;
129*d0ef721eSBaptiste Daroussin 	el->el_prompt.p_ignore = '\0';
130*d0ef721eSBaptiste Daroussin 	el->el_rprompt.p_func = prompt_default_r;
131*d0ef721eSBaptiste Daroussin 	el->el_rprompt.p_pos.v = 0;
132*d0ef721eSBaptiste Daroussin 	el->el_rprompt.p_pos.h = 0;
133*d0ef721eSBaptiste Daroussin 	el->el_rprompt.p_ignore = '\0';
134*d0ef721eSBaptiste Daroussin 	return 0;
135*d0ef721eSBaptiste Daroussin }
136*d0ef721eSBaptiste Daroussin 
137*d0ef721eSBaptiste Daroussin 
138*d0ef721eSBaptiste Daroussin /* prompt_end():
139*d0ef721eSBaptiste Daroussin  *	Clean up the prompt stuff
140*d0ef721eSBaptiste Daroussin  */
141*d0ef721eSBaptiste Daroussin libedit_private void
142*d0ef721eSBaptiste Daroussin /*ARGSUSED*/
prompt_end(EditLine * el)143*d0ef721eSBaptiste Daroussin prompt_end(EditLine *el __attribute__((__unused__)))
144*d0ef721eSBaptiste Daroussin {
145*d0ef721eSBaptiste Daroussin }
146*d0ef721eSBaptiste Daroussin 
147*d0ef721eSBaptiste Daroussin 
148*d0ef721eSBaptiste Daroussin /* prompt_set():
149*d0ef721eSBaptiste Daroussin  *	Install a prompt printing function
150*d0ef721eSBaptiste Daroussin  */
151*d0ef721eSBaptiste Daroussin libedit_private int
prompt_set(EditLine * el,el_pfunc_t prf,wchar_t c,int op,int wide)152*d0ef721eSBaptiste Daroussin prompt_set(EditLine *el, el_pfunc_t prf, wchar_t c, int op, int wide)
153*d0ef721eSBaptiste Daroussin {
154*d0ef721eSBaptiste Daroussin 	el_prompt_t *p;
155*d0ef721eSBaptiste Daroussin 
156*d0ef721eSBaptiste Daroussin 	if (op == EL_PROMPT || op == EL_PROMPT_ESC)
157*d0ef721eSBaptiste Daroussin 		p = &el->el_prompt;
158*d0ef721eSBaptiste Daroussin 	else
159*d0ef721eSBaptiste Daroussin 		p = &el->el_rprompt;
160*d0ef721eSBaptiste Daroussin 
161*d0ef721eSBaptiste Daroussin 	if (prf == NULL) {
162*d0ef721eSBaptiste Daroussin 		if (op == EL_PROMPT || op == EL_PROMPT_ESC)
163*d0ef721eSBaptiste Daroussin 			p->p_func = prompt_default;
164*d0ef721eSBaptiste Daroussin 		else
165*d0ef721eSBaptiste Daroussin 			p->p_func = prompt_default_r;
166*d0ef721eSBaptiste Daroussin 	} else {
167*d0ef721eSBaptiste Daroussin 		p->p_func = prf;
168*d0ef721eSBaptiste Daroussin 	}
169*d0ef721eSBaptiste Daroussin 
170*d0ef721eSBaptiste Daroussin 	p->p_ignore = c;
171*d0ef721eSBaptiste Daroussin 
172*d0ef721eSBaptiste Daroussin 	p->p_pos.v = 0;
173*d0ef721eSBaptiste Daroussin 	p->p_pos.h = 0;
174*d0ef721eSBaptiste Daroussin 	p->p_wide = wide;
175*d0ef721eSBaptiste Daroussin 
176*d0ef721eSBaptiste Daroussin 	return 0;
177*d0ef721eSBaptiste Daroussin }
178*d0ef721eSBaptiste Daroussin 
179*d0ef721eSBaptiste Daroussin 
180*d0ef721eSBaptiste Daroussin /* prompt_get():
181*d0ef721eSBaptiste Daroussin  *	Retrieve the prompt printing function
182*d0ef721eSBaptiste Daroussin  */
183*d0ef721eSBaptiste Daroussin libedit_private int
prompt_get(EditLine * el,el_pfunc_t * prf,wchar_t * c,int op)184*d0ef721eSBaptiste Daroussin prompt_get(EditLine *el, el_pfunc_t *prf, wchar_t *c, int op)
185*d0ef721eSBaptiste Daroussin {
186*d0ef721eSBaptiste Daroussin 	el_prompt_t *p;
187*d0ef721eSBaptiste Daroussin 
188*d0ef721eSBaptiste Daroussin 	if (prf == NULL)
189*d0ef721eSBaptiste Daroussin 		return -1;
190*d0ef721eSBaptiste Daroussin 
191*d0ef721eSBaptiste Daroussin 	if (op == EL_PROMPT)
192*d0ef721eSBaptiste Daroussin 		p = &el->el_prompt;
193*d0ef721eSBaptiste Daroussin 	else
194*d0ef721eSBaptiste Daroussin 		p = &el->el_rprompt;
195*d0ef721eSBaptiste Daroussin 
196*d0ef721eSBaptiste Daroussin 	if (prf)
197*d0ef721eSBaptiste Daroussin 		*prf = p->p_func;
198*d0ef721eSBaptiste Daroussin 	if (c)
199*d0ef721eSBaptiste Daroussin 		*c = p->p_ignore;
200*d0ef721eSBaptiste Daroussin 
201*d0ef721eSBaptiste Daroussin 	return 0;
202*d0ef721eSBaptiste Daroussin }
203