How buggy this little piece of code could be? Repair strnvis() buffersize
[dragonfly.git] / lib / libedit / prompt.c
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  * @(#)prompt.c 8.1 (Berkeley) 6/4/93
33  * $NetBSD: prompt.c,v 1.11 2003/08/07 16:44:32 agc Exp $
34  * $DragonFly: src/lib/libedit/prompt.c,v 1.5 2005/11/13 11:58:30 corecode Exp $
35  */
36
37 #include "config.h"
38
39 /*
40  * prompt.c: Prompt printing functions
41  */
42 #include <stdio.h>
43 #include "el.h"
44
45 private char    *prompt_default(EditLine *);
46 private char    *prompt_default_r(EditLine *);
47
48 /* prompt_default():
49  *      Just a default prompt, in case the user did not provide one
50  */
51 private char *
52 /*ARGSUSED*/
53 prompt_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  */
64 private char *
65 /*ARGSUSED*/
66 prompt_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  */
80 protected void
81 prompt_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  */
102 protected int
103 prompt_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  */
119 protected void
120 /*ARGSUSED*/
121 prompt_end(EditLine *el __attribute__((__unused__)))
122 {
123 }
124
125
126 /* prompt_set():
127  *      Install a prompt printing function
128  */
129 protected int
130 prompt_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  */
154 protected int
155 prompt_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 }