1166124Srafan/****************************************************************************
2174993Srafan * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc.              *
3166124Srafan *                                                                          *
4166124Srafan * Permission is hereby granted, free of charge, to any person obtaining a  *
5166124Srafan * copy of this software and associated documentation files (the            *
6166124Srafan * "Software"), to deal in the Software without restriction, including      *
7166124Srafan * without limitation the rights to use, copy, modify, merge, publish,      *
8166124Srafan * distribute, distribute with modifications, sublicense, and/or sell       *
9166124Srafan * copies of the Software, and to permit persons to whom the Software is    *
10166124Srafan * furnished to do so, subject to the following conditions:                 *
11166124Srafan *                                                                          *
12166124Srafan * The above copyright notice and this permission notice shall be included  *
13166124Srafan * in all copies or substantial portions of the Software.                   *
14166124Srafan *                                                                          *
15166124Srafan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16166124Srafan * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17166124Srafan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18166124Srafan * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19166124Srafan * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20166124Srafan * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21166124Srafan * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22166124Srafan *                                                                          *
23166124Srafan * Except as contained in this notice, the name(s) of the above copyright   *
24166124Srafan * holders shall not be used in advertising or otherwise to promote the     *
25166124Srafan * sale, use or other dealings in this Software without prior written       *
26166124Srafan * authorization.                                                           *
27166124Srafan ****************************************************************************/
2850276Speter
2950276Speter/***************************************************************************
3050276Speter*                                                                          *
31166124Srafan*  Author : Juergen Pfeifer                                                *
3250276Speter*                                                                          *
3350276Speter***************************************************************************/
3450276Speter
3550276Speter#include "form.priv.h"
3650276Speter
37174993SrafanMODULE_ID("$Id: fty_int.c,v 1.22 2007/10/13 19:32:40 tom Exp $")
3850276Speter
39166124Srafan#if USE_WIDEC_SUPPORT
40166124Srafan#define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c)))
41166124Srafan#else
42166124Srafan#define isDigit(c) isdigit(UChar(c))
43166124Srafan#endif
4450276Speter
45166124Srafan#define thisARG integerARG
46166124Srafan
47166124Srafantypedef struct
48166124Srafan  {
49166124Srafan    int precision;
50166124Srafan    long low;
51166124Srafan    long high;
52166124Srafan  }
53166124SrafanthisARG;
54166124Srafan
5550276Speter/*---------------------------------------------------------------------------
5650276Speter|   Facility      :  libnform
57166124Srafan|   Function      :  static void *Make_This_Type( va_list * ap )
5850276Speter|
5950276Speter|   Description   :  Allocate structure for integer type argument.
6050276Speter|
6150276Speter|   Return Values :  Pointer to argument structure or NULL on error
6250276Speter+--------------------------------------------------------------------------*/
63166124Srafanstatic void *
64166124SrafanMake_This_Type(va_list *ap)
6550276Speter{
66174993Srafan  thisARG *argp = typeMalloc(thisARG, 1);
6750276Speter
6850276Speter  if (argp)
6950276Speter    {
70174993Srafan      T((T_CREATE("thisARG %p"), argp));
71166124Srafan      argp->precision = va_arg(*ap, int);
72166124Srafan      argp->low = va_arg(*ap, long);
73166124Srafan      argp->high = va_arg(*ap, long);
7450276Speter    }
7550276Speter  return (void *)argp;
7650276Speter}
7750276Speter
7850276Speter/*---------------------------------------------------------------------------
7950276Speter|   Facility      :  libnform
80166124Srafan|   Function      :  static void *Copy_This_Type(const void * argp)
8150276Speter|
8250276Speter|   Description   :  Copy structure for integer type argument.
8350276Speter|
8450276Speter|   Return Values :  Pointer to argument structure or NULL on error.
8550276Speter+--------------------------------------------------------------------------*/
86166124Srafanstatic void *
87166124SrafanCopy_This_Type(const void *argp)
8850276Speter{
89166124Srafan  const thisARG *ap = (const thisARG *)argp;
90166124Srafan  thisARG *result = (thisARG *) 0;
9150276Speter
9250276Speter  if (argp)
9350276Speter    {
94174993Srafan      result = typeMalloc(thisARG, 1);
9550276Speter      if (result)
96174993Srafan	{
97174993Srafan	  T((T_CREATE("thisARG %p"), result));
98174993Srafan	  *result = *ap;
99174993Srafan	}
10050276Speter    }
10150276Speter  return (void *)result;
10250276Speter}
10350276Speter
10450276Speter/*---------------------------------------------------------------------------
10550276Speter|   Facility      :  libnform
106166124Srafan|   Function      :  static void Free_This_Type(void * argp)
10750276Speter|
10850276Speter|   Description   :  Free structure for integer type argument.
10950276Speter|
11050276Speter|   Return Values :  -
11150276Speter+--------------------------------------------------------------------------*/
112166124Srafanstatic void
113166124SrafanFree_This_Type(void *argp)
11450276Speter{
115166124Srafan  if (argp)
11650276Speter    free(argp);
11750276Speter}
11850276Speter
11950276Speter/*---------------------------------------------------------------------------
12050276Speter|   Facility      :  libnform
121166124Srafan|   Function      :  static bool Check_This_Field(
122166124Srafan|                                                 FIELD * field,
123166124Srafan|                                                 const void * argp)
12450276Speter|
12550276Speter|   Description   :  Validate buffer content to be a valid integer value
12650276Speter|
12750276Speter|   Return Values :  TRUE  - field is valid
12850276Speter|                    FALSE - field is invalid
12950276Speter+--------------------------------------------------------------------------*/
130166124Srafanstatic bool
131166124SrafanCheck_This_Field(FIELD *field, const void *argp)
13250276Speter{
133166124Srafan  const thisARG *argi = (const thisARG *)argp;
134166124Srafan  long low = argi->low;
135166124Srafan  long high = argi->high;
136166124Srafan  int prec = argi->precision;
137166124Srafan  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
138166124Srafan  char *s = (char *)bp;
13950276Speter  long val;
14050276Speter  char buf[100];
141166124Srafan  bool result = FALSE;
14250276Speter
143166124Srafan  while (*bp && *bp == ' ')
144166124Srafan    bp++;
14550276Speter  if (*bp)
14650276Speter    {
147166124Srafan      if (*bp == '-')
148166124Srafan	bp++;
149166124Srafan#if USE_WIDEC_SUPPORT
150166124Srafan      if (*bp)
151166124Srafan	{
152166124Srafan	  bool blank = FALSE;
153166124Srafan	  int len;
154166124Srafan	  int n;
155166124Srafan	  wchar_t *list = _nc_Widen_String((char *)bp, &len);
156166124Srafan
157166124Srafan	  if (list != 0)
158166124Srafan	    {
159166124Srafan	      result = TRUE;
160166124Srafan	      for (n = 0; n < len; ++n)
161166124Srafan		{
162166124Srafan		  if (blank)
163166124Srafan		    {
164166124Srafan		      if (list[n] != ' ')
165166124Srafan			{
166166124Srafan			  result = FALSE;
167166124Srafan			  break;
168166124Srafan			}
169166124Srafan		    }
170166124Srafan		  else if (list[n] == ' ')
171166124Srafan		    {
172166124Srafan		      blank = TRUE;
173166124Srafan		    }
174166124Srafan		  else if (!isDigit(list[n]))
175166124Srafan		    {
176166124Srafan		      result = FALSE;
177166124Srafan		      break;
178166124Srafan		    }
179166124Srafan		}
180166124Srafan	      free(list);
181166124Srafan	    }
182166124Srafan	}
183166124Srafan#else
18450276Speter      while (*bp)
18550276Speter	{
186166124Srafan	  if (!isdigit(UChar(*bp)))
187166124Srafan	    break;
18850276Speter	  bp++;
18950276Speter	}
190166124Srafan      while (*bp && *bp == ' ')
191166124Srafan	bp++;
192166124Srafan      result = (*bp == '\0');
193166124Srafan#endif
194166124Srafan      if (result)
19550276Speter	{
19650276Speter	  val = atol(s);
197166124Srafan	  if (low < high)
19850276Speter	    {
199166124Srafan	      if (val < low || val > high)
200166124Srafan		result = FALSE;
20150276Speter	    }
202166124Srafan	  if (result)
203166124Srafan	    {
204166124Srafan	      sprintf(buf, "%.*ld", (prec > 0 ? prec : 0), val);
205166124Srafan	      set_field_buffer(field, 0, buf);
206166124Srafan	    }
20750276Speter	}
20850276Speter    }
209166124Srafan  return (result);
21050276Speter}
21150276Speter
21250276Speter/*---------------------------------------------------------------------------
21350276Speter|   Facility      :  libnform
214166124Srafan|   Function      :  static bool Check_This_Character(
21550276Speter|                                      int c,
21650276Speter|                                      const void * argp)
21750276Speter|
21850276Speter|   Description   :  Check a character for the integer type.
21950276Speter|
22050276Speter|   Return Values :  TRUE  - character is valid
22150276Speter|                    FALSE - character is invalid
22250276Speter+--------------------------------------------------------------------------*/
223166124Srafanstatic bool
224166124SrafanCheck_This_Character(int c, const void *argp GCC_UNUSED)
22550276Speter{
226166124Srafan  return ((isDigit(UChar(c)) || (c == '-')) ? TRUE : FALSE);
22750276Speter}
22850276Speter
229166124Srafanstatic FIELDTYPE typeTHIS =
230166124Srafan{
23150276Speter  _HAS_ARGS | _RESIDENT,
232166124Srafan  1,				/* this is mutable, so we can't be const */
23350276Speter  (FIELDTYPE *)0,
23450276Speter  (FIELDTYPE *)0,
235166124Srafan  Make_This_Type,
236166124Srafan  Copy_This_Type,
237166124Srafan  Free_This_Type,
238166124Srafan  Check_This_Field,
239166124Srafan  Check_This_Character,
24050276Speter  NULL,
24150276Speter  NULL
24250276Speter};
24350276Speter
244166124SrafanNCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_INTEGER = &typeTHIS;
24550276Speter
24650276Speter/* fty_int.c ends here */
247