1 /*
2 NETWIB
3 Network library
4 Copyright(c) 1999-2010 Laurent Constantin
5 -----
6
7 Main server : http://www.laurentconstantin.com/
8 Backup server : http://laurentconstantin.free.fr/
9 [my current email address is on the web servers]
10
11 -----
12 This file is part of Netwib.
13
14 Netwib is free software: you can redistribute it and/or modify
15 it under the terms of the GNU General Public License version 3
16 as published by the Free Software Foundation.
17
18 Netwib is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details (http://www.gnu.org/).
22
23 ------------------------------------------------------------------------
24 */
25
26 #include <netwib/inc/maininc.h>
27
28 /*-------------------------------------------------------------*/
netwib_uint32_init_kbd(netwib_constbuf * pmessage,netwib_uint32 min,netwib_uint32 max,netwib_uint32 defaultnumber,netwib_uint32 * pnumber)29 netwib_err netwib_uint32_init_kbd(netwib_constbuf *pmessage,
30 netwib_uint32 min,
31 netwib_uint32 max,
32 netwib_uint32 defaultnumber,
33 netwib_uint32 *pnumber)
34 {
35 netwib_buf buf;
36 netwib_char prompt;
37 netwib_bool havemessage;
38 netwib_uint32 number=0;
39 netwib_priv_kbd kbd;
40 netwib_err ret;
41
42 /* parameters verification */
43 if (min > max) {
44 return(NETWIB_ERR_PAINVALIDRANGE);
45 }
46 if (defaultnumber != NETWIB_UINT32_INIT_KBD_NODEF) {
47 if (defaultnumber > max) return(NETWIB_ERR_PAINVALIDDEFAULT);
48 if (defaultnumber < min) return(NETWIB_ERR_PAINVALIDDEFAULT);
49 }
50
51 havemessage = NETWIB_FALSE;
52 if (netwib__buf_ref_data_sizenull(pmessage) != 0) {
53 havemessage = NETWIB_TRUE;
54 }
55
56 /* ask user */
57 prompt = ':';
58 netwib_er(netwib_priv_kbd_initdefault(&kbd));
59 netwib_er(netwib_priv_kbd_ctl_set_echoline(&kbd, NETWIB_TRUE, NETWIB_TRUE));
60 netwib_er(netwib_buf_init_mallocdefault(&buf));
61 while (NETWIB_TRUE) {
62 if (havemessage) {
63 netwib_er(netwib_fmt_display("%{buf}", pmessage));
64 if (min != NETWIB_UINT32_INIT_KBD_NOMIN ||
65 max != NETWIB_UINT32_INIT_KBD_NOMAX ||
66 defaultnumber != NETWIB_UINT32_INIT_KBD_NODEF) {
67 netwib_er(netwib_fmt_display(" "));
68 if (min != NETWIB_UINT32_INIT_KBD_NOMIN ||
69 max != NETWIB_UINT32_INIT_KBD_NOMAX) {
70 netwib_er(netwib_fmt_display("(between %{uint32} and %{uint32})",
71 min, max));
72 }
73 if (defaultnumber != NETWIB_UINT32_INIT_KBD_NODEF) {
74 netwib_er(netwib_fmt_display("[%{uint32}]", defaultnumber));
75 }
76 }
77 netwib_er(netwib_fmt_display("%c ", prompt));
78 }
79 netwib_er(netwib_priv_kbd_read_line(&kbd, &buf));
80 if (netwib__buf_ref_data_size(&buf) == 0) {
81 if (defaultnumber != NETWIB_UINT32_INIT_KBD_NODEF) {
82 number = defaultnumber;
83 break;
84 }
85 } else {
86 ret = netwib_buf_decode_fmt(&buf, "%{uint32}%$", &number);
87 if (ret == NETWIB_ERR_OK) {
88 if ((number >= min) && (number <= max)) {
89 break;
90 }
91 }
92 }
93 prompt = '>';
94 netwib__buf_reinit(&buf);
95 }
96 netwib_er(netwib_buf_close(&buf));
97 netwib_er(netwib_priv_kbd_close(&kbd));
98
99 if (pnumber != NULL) *pnumber = number;
100 return(NETWIB_ERR_OK);
101 }
102
103 /*-------------------------------------------------------------*/
netwib_uint64_init_kbd(netwib_constbuf * pmessage,netwib_uint64 defaultnumber,netwib_uint64 * pnumber)104 netwib_err netwib_uint64_init_kbd(netwib_constbuf *pmessage,
105 netwib_uint64 defaultnumber,
106 netwib_uint64 *pnumber)
107 {
108 netwib_buf buf;
109 netwib_char prompt;
110 netwib_bool havemessage;
111 netwib_uint64 number;
112 netwib_priv_kbd kbd;
113 netwib_err ret;
114
115 netwib__uint64_init_uint32(0, number);
116 havemessage = NETWIB_FALSE;
117 if (netwib__buf_ref_data_sizenull(pmessage) != 0) {
118 havemessage = NETWIB_TRUE;
119 }
120
121 /* ask user */
122 prompt = ':';
123 netwib_er(netwib_priv_kbd_initdefault(&kbd));
124 netwib_er(netwib_priv_kbd_ctl_set_echoline(&kbd, NETWIB_TRUE, NETWIB_TRUE));
125 netwib_er(netwib_buf_init_mallocdefault(&buf));
126 while (NETWIB_TRUE) {
127 if (havemessage) {
128 netwib_er(netwib_fmt_display("%{buf}", pmessage));
129 netwib_er(netwib_fmt_display("%c ", prompt));
130 }
131 netwib_er(netwib_priv_kbd_read_line(&kbd, &buf));
132 if (netwib__buf_ref_data_size(&buf) == 0) {
133 number = defaultnumber;
134 break;
135 } else {
136 ret = netwib_buf_decode_fmt(&buf, "%{uint64}%$", &number);
137 if (ret == NETWIB_ERR_OK) {
138 break;
139 }
140 }
141 prompt = '>';
142 netwib__buf_reinit(&buf);
143 }
144 netwib_er(netwib_buf_close(&buf));
145 netwib_er(netwib_priv_kbd_close(&kbd));
146
147 if (pnumber != NULL) *pnumber = number;
148 return(NETWIB_ERR_OK);
149 }
150
151 /*-------------------------------------------------------------*/
netwib_int32_init_kbd(netwib_constbuf * pmessage,netwib_int32 min,netwib_int32 max,netwib_int32 defaultnumber,netwib_int32 * pnumber)152 netwib_err netwib_int32_init_kbd(netwib_constbuf *pmessage,
153 netwib_int32 min,
154 netwib_int32 max,
155 netwib_int32 defaultnumber,
156 netwib_int32 *pnumber)
157 {
158 netwib_buf buf;
159 netwib_char prompt;
160 netwib_bool havemessage;
161 netwib_int32 number=0;
162 netwib_priv_kbd kbd;
163 netwib_err ret;
164
165 /* parameters verification */
166 if (min > max) {
167 return(NETWIB_ERR_PAINVALIDRANGE);
168 }
169 if (defaultnumber != NETWIB_INT32_INIT_KBD_NODEF) {
170 if (defaultnumber > max) return(NETWIB_ERR_PAINVALIDDEFAULT);
171 if (defaultnumber < min) return(NETWIB_ERR_PAINVALIDDEFAULT);
172 }
173
174 havemessage = NETWIB_FALSE;
175 if (netwib__buf_ref_data_sizenull(pmessage) != 0) {
176 havemessage = NETWIB_TRUE;
177 }
178
179 /* ask user */
180 prompt = ':';
181 netwib_er(netwib_priv_kbd_initdefault(&kbd));
182 netwib_er(netwib_priv_kbd_ctl_set_echoline(&kbd, NETWIB_TRUE, NETWIB_TRUE));
183 netwib_er(netwib_buf_init_mallocdefault(&buf));
184 while (NETWIB_TRUE) {
185 if (havemessage) {
186 netwib_er(netwib_fmt_display("%{buf}", pmessage));
187 if (min != NETWIB_INT32_INIT_KBD_NOMIN ||
188 max != NETWIB_INT32_INIT_KBD_NOMAX ||
189 defaultnumber != NETWIB_INT32_INIT_KBD_NODEF) {
190 netwib_er(netwib_fmt_display(" "));
191 if (min != NETWIB_INT32_INIT_KBD_NOMIN ||
192 max != NETWIB_INT32_INIT_KBD_NOMAX) {
193 netwib_er(netwib_fmt_display("(between %{int32} and %{int32})",
194 min, max));
195 }
196 if (defaultnumber != NETWIB_INT32_INIT_KBD_NODEF) {
197 netwib_er(netwib_fmt_display("[%{int32}]", defaultnumber));
198 }
199 }
200 netwib_er(netwib_fmt_display("%c ", prompt));
201 }
202 netwib_er(netwib_priv_kbd_read_line(&kbd, &buf));
203 if (netwib__buf_ref_data_size(&buf) == 0) {
204 if (defaultnumber != NETWIB_INT32_INIT_KBD_NODEF) {
205 number = defaultnumber;
206 break;
207 }
208 } else {
209 ret = netwib_buf_decode_fmt(&buf, "%{int32}%$", &number);
210 if (ret == NETWIB_ERR_OK) {
211 if ((number >= min) && (number <= max)) {
212 break;
213 }
214 }
215 }
216 prompt = '>';
217 netwib__buf_reinit(&buf);
218 }
219 netwib_er(netwib_buf_close(&buf));
220 netwib_er(netwib_priv_kbd_initdefault(&kbd));
221
222 if (pnumber != NULL) *pnumber = number;
223 return(NETWIB_ERR_OK);
224 }
225
226 /*-------------------------------------------------------------*/
netwib_int64_init_kbd(netwib_constbuf * pmessage,netwib_int64 defaultnumber,netwib_int64 * pnumber)227 netwib_err netwib_int64_init_kbd(netwib_constbuf *pmessage,
228 netwib_int64 defaultnumber,
229 netwib_int64 *pnumber)
230 {
231 netwib_buf buf;
232 netwib_char prompt;
233 netwib_bool havemessage;
234 netwib_int64 number;
235 netwib_priv_kbd kbd;
236 netwib_err ret;
237
238 netwib__int64_init_int32(0, number);
239 havemessage = NETWIB_FALSE;
240 if (netwib__buf_ref_data_sizenull(pmessage) != 0) {
241 havemessage = NETWIB_TRUE;
242 }
243
244 /* ask user */
245 prompt = ':';
246 netwib_er(netwib_priv_kbd_initdefault(&kbd));
247 netwib_er(netwib_priv_kbd_ctl_set_echoline(&kbd, NETWIB_TRUE, NETWIB_TRUE));
248 netwib_er(netwib_buf_init_mallocdefault(&buf));
249 while (NETWIB_TRUE) {
250 if (havemessage) {
251 netwib_er(netwib_fmt_display("%{buf}", pmessage));
252 netwib_er(netwib_fmt_display("%c ", prompt));
253 }
254 netwib_er(netwib_priv_kbd_read_line(&kbd, &buf));
255 if (netwib__buf_ref_data_size(&buf) == 0) {
256 number = defaultnumber;
257 break;
258 } else {
259 ret = netwib_buf_decode_fmt(&buf, "%{int64}%$", &number);
260 if (ret == NETWIB_ERR_OK) {
261 break;
262 }
263 }
264 prompt = '>';
265 netwib__buf_reinit(&buf);
266 }
267 netwib_er(netwib_buf_close(&buf));
268 netwib_er(netwib_priv_kbd_close(&kbd));
269
270 if (pnumber != NULL) *pnumber = number;
271 return(NETWIB_ERR_OK);
272 }
273
274