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