112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*	$NetBSD: prompt.c,v 1.20 2011/07/29 15:16:33 christos Exp $	*/
212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*-
412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Copyright (c) 1992, 1993
512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	The Regents of the University of California.  All rights reserved.
612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * This code is derived from software contributed to Berkeley by
812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Christos Zoulas of Cornell University.
912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
1012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Redistribution and use in source and binary forms, with or without
1112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * modification, are permitted provided that the following conditions
1212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * are met:
1312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 1. Redistributions of source code must retain the above copyright
1412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer.
1512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 2. Redistributions in binary form must reproduce the above copyright
1612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer in the
1712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    documentation and/or other materials provided with the distribution.
1812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 3. Neither the name of the University nor the names of its contributors
1912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    may be used to endorse or promote products derived from this software
2012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    without specific prior written permission.
2112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
2212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * SUCH DAMAGE.
3312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
3412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
3512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "config.h"
3612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if !defined(lint) && !defined(SCCSID)
3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if 0
3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char sccsid[] = "@(#)prompt.c	8.1 (Berkeley) 6/4/93";
3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else
4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__RCSID("$NetBSD: prompt.c,v 1.20 2011/07/29 15:16:33 christos Exp $");
4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif /* not lint && not SCCSID */
4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * prompt.c: Prompt printing functions
4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdio.h>
4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "el.h"
4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate Char	*prompt_default(EditLine *);
5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate Char	*prompt_default_r(EditLine *);
5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* prompt_default():
5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Just a default prompt, in case the user did not provide one
5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate Char *
5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt_default(EditLine *el __attribute__((__unused__)))
5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static Char a[3] = {'?', ' ', '\0'};
6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return a;
6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* prompt_default_r():
6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Just a default rprompt, in case the user did not provide one
6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate Char *
7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt_default_r(EditLine *el __attribute__((__unused__)))
7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static Char a[1] = {'\0'};
7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return a;
7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* prompt_print():
8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Print the prompt and update the prompt position.
8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected void
8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt_print(EditLine *el, int op)
8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_prompt_t *elp;
8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *p;
8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int ignore = 0;
8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (op == EL_PROMPT)
9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		elp = &el->el_prompt;
9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		elp = &el->el_rprompt;
9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (elp->p_wide)
9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		p = (*elp->p_func)(el);
9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		p = ct_decode_string((char *)(void *)(*elp->p_func)(el),
9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    &el->el_scratch);
9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (; *p; p++) {
10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (elp->p_ignore == *p) {
10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ignore = !ignore;
10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			continue;
10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (ignore)
10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			terminal__putc(el, *p);
10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else
10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			re_putc(el, *p, 1);
10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	elp->p_pos.v = el->el_refresh.r_cursor.v;
11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	elp->p_pos.h = el->el_refresh.r_cursor.h;
11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* prompt_init():
11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Initialize the prompt stuff
11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected int
12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt_init(EditLine *el)
12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_prompt.p_func = prompt_default;
12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_prompt.p_pos.v = 0;
12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_prompt.p_pos.h = 0;
12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_prompt.p_ignore = '\0';
12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_rprompt.p_func = prompt_default_r;
12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_rprompt.p_pos.v = 0;
12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_rprompt.p_pos.h = 0;
13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el->el_rprompt.p_ignore = '\0';
13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* prompt_end():
13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Clean up the prompt stuff
13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected void
13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt_end(EditLine *el __attribute__((__unused__)))
14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* prompt_set():
14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Install a prompt printing function
14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected int
14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt_set(EditLine *el, el_pfunc_t prf, Char c, int op, int wide)
15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_prompt_t *p;
15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (op == EL_PROMPT || op == EL_PROMPT_ESC)
15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		p = &el->el_prompt;
15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		p = &el->el_rprompt;
15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (prf == NULL) {
15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (op == EL_PROMPT || op == EL_PROMPT_ESC)
16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			p->p_func = prompt_default;
16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else
16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			p->p_func = prompt_default_r;
16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		p->p_func = prf;
16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	p->p_ignore = c;
16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	p->p_pos.v = 0;
17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	p->p_pos.h = 0;
17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	p->p_wide = wide;
17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* prompt_get():
17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Retrieve the prompt printing function
17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprotected int
18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt_get(EditLine *el, el_pfunc_t *prf, Char *c, int op)
18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_prompt_t *p;
18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (prf == NULL)
18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (op == EL_PROMPT)
18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		p = &el->el_prompt;
19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		p = &el->el_rprompt;
19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (prf)
19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*prf = p->p_func;
19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (c)
19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*c = p->p_ignore;
19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
200