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