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