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