prompt.c revision 148834
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: head/lib/libedit/prompt.c 148834 2005-08-07 20:55:59Z stefanf $");
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
89	if (op == EL_PROMPT)
90		elp = &el->el_prompt;
91	else
92		elp = &el->el_rprompt;
93	p = (elp->p_func) (el);
94	while (*p)
95		re_putc(el, *p++, 1);
96
97	elp->p_pos.v = el->el_refresh.r_cursor.v;
98	elp->p_pos.h = el->el_refresh.r_cursor.h;
99}
100
101
102/* prompt_init():
103 *	Initialize the prompt stuff
104 */
105protected int
106prompt_init(EditLine *el)
107{
108
109	el->el_prompt.p_func = prompt_default;
110	el->el_prompt.p_pos.v = 0;
111	el->el_prompt.p_pos.h = 0;
112	el->el_rprompt.p_func = prompt_default_r;
113	el->el_rprompt.p_pos.v = 0;
114	el->el_rprompt.p_pos.h = 0;
115	return (0);
116}
117
118
119/* prompt_end():
120 *	Clean up the prompt stuff
121 */
122protected void
123/*ARGSUSED*/
124prompt_end(EditLine *el __unused)
125{
126}
127
128
129/* prompt_set():
130 *	Install a prompt printing function
131 */
132protected int
133prompt_set(EditLine *el, el_pfunc_t prf, int op)
134{
135	el_prompt_t *p;
136
137	if (op == EL_PROMPT)
138		p = &el->el_prompt;
139	else
140		p = &el->el_rprompt;
141	if (prf == NULL) {
142		if (op == EL_PROMPT)
143			p->p_func = prompt_default;
144		else
145			p->p_func = prompt_default_r;
146	} else
147		p->p_func = prf;
148	p->p_pos.v = 0;
149	p->p_pos.h = 0;
150	return (0);
151}
152
153
154/* prompt_get():
155 *	Retrieve the prompt printing function
156 */
157protected int
158prompt_get(EditLine *el, el_pfunc_t *prf, int op)
159{
160
161	if (prf == NULL)
162		return (-1);
163	if (op == EL_PROMPT)
164		*prf = el->el_prompt.p_func;
165	else
166		*prf = el->el_rprompt.p_func;
167	return (0);
168}
169