1/*	$NetBSD: prompt.c,v 1.5 2005/06/09 16:48:58 lukem Exp $	*/
2/*	from	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 "tnftp.h"
37#include "sys.h"
38
39/*
40 * prompt.c: Prompt printing functions
41 */
42#include <stdio.h>
43#include "el.h"
44
45private char	*prompt_default(EditLine *);
46private char	*prompt_default_r(EditLine *);
47
48/* prompt_default():
49 *	Just a default prompt, in case the user did not provide one
50 */
51private char *
52/*ARGSUSED*/
53prompt_default(EditLine *el __attribute__((__unused__)))
54{
55	static char a[3] = {'?', ' ', '\0'};
56
57	return (a);
58}
59
60
61/* prompt_default_r():
62 *	Just a default rprompt, in case the user did not provide one
63 */
64private char *
65/*ARGSUSED*/
66prompt_default_r(EditLine *el __attribute__((__unused__)))
67{
68	static char a[1] = {'\0'};
69
70	return (a);
71}
72
73
74/* prompt_print():
75 *	Print the prompt and update the prompt position.
76 *	We use an array of integers in case we want to pass
77 * 	literal escape sequences in the prompt and we want a
78 *	bit to flag them
79 */
80protected void
81prompt_print(EditLine *el, int op)
82{
83	el_prompt_t *elp;
84	char *p;
85
86	if (op == EL_PROMPT)
87		elp = &el->el_prompt;
88	else
89		elp = &el->el_rprompt;
90	p = (elp->p_func) (el);
91	while (*p)
92		re_putc(el, *p++, 1);
93
94	elp->p_pos.v = el->el_refresh.r_cursor.v;
95	elp->p_pos.h = el->el_refresh.r_cursor.h;
96}
97
98
99/* prompt_init():
100 *	Initialize the prompt stuff
101 */
102protected int
103prompt_init(EditLine *el)
104{
105
106	el->el_prompt.p_func = prompt_default;
107	el->el_prompt.p_pos.v = 0;
108	el->el_prompt.p_pos.h = 0;
109	el->el_rprompt.p_func = prompt_default_r;
110	el->el_rprompt.p_pos.v = 0;
111	el->el_rprompt.p_pos.h = 0;
112	return (0);
113}
114
115
116/* prompt_end():
117 *	Clean up the prompt stuff
118 */
119protected void
120/*ARGSUSED*/
121prompt_end(EditLine *el __attribute__((__unused__)))
122{
123}
124
125
126/* prompt_set():
127 *	Install a prompt printing function
128 */
129protected int
130prompt_set(EditLine *el, el_pfunc_t prf, int op)
131{
132	el_prompt_t *p;
133
134	if (op == EL_PROMPT)
135		p = &el->el_prompt;
136	else
137		p = &el->el_rprompt;
138	if (prf == NULL) {
139		if (op == EL_PROMPT)
140			p->p_func = prompt_default;
141		else
142			p->p_func = prompt_default_r;
143	} else
144		p->p_func = prf;
145	p->p_pos.v = 0;
146	p->p_pos.h = 0;
147	return (0);
148}
149
150
151/* prompt_get():
152 *	Retrieve the prompt printing function
153 */
154protected int
155prompt_get(EditLine *el, el_pfunc_t *prf, int op)
156{
157
158	if (prf == NULL)
159		return (-1);
160	if (op == EL_PROMPT)
161		*prf = el->el_prompt.p_func;
162	else
163		*prf = el->el_rprompt.p_func;
164	return (0);
165}
166