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