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