3 * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
4 * You may freely copy it for use as a template for your own field types.
5 * If you develop a field type that might be of general use, please send
6 * it back to the ncurses maintainers for inclusion in the next version.
8 /***************************************************************************
10 * Author : Juergen Pfeifer *
12 ***************************************************************************/
14 #include "form.priv.h"
16 MODULE_ID("$Id: fty_num.c,v 1.16 2003/10/25 14:54:48 tom Exp $")
29 /*---------------------------------------------------------------------------
31 | Function : static void *Make_Numeric_Type(va_list * ap)
33 | Description : Allocate structure for numeric type argument.
35 | Return Values : Pointer to argument structure or NULL on error
36 +--------------------------------------------------------------------------*/
37 static void *Make_Numeric_Type(va_list * ap)
39 numericARG *argn = (numericARG *)malloc(sizeof(numericARG));
43 argn->precision = va_arg(*ap,int);
44 argn->low = va_arg(*ap,double);
45 argn->high = va_arg(*ap,double);
47 argn->L = localeconv();
55 /*---------------------------------------------------------------------------
57 | Function : static void *Copy_Numeric_Type(const void * argp)
59 | Description : Copy structure for numeric type argument.
61 | Return Values : Pointer to argument structure or NULL on error.
62 +--------------------------------------------------------------------------*/
63 static void *Copy_Numeric_Type(const void * argp)
65 const numericARG *ap = (const numericARG *)argp;
66 numericARG *result = (numericARG *)0;
70 result = (numericARG *)malloc(sizeof(numericARG));
74 return (void *)result;
77 /*---------------------------------------------------------------------------
79 | Function : static void Free_Numeric_Type(void * argp)
81 | Description : Free structure for numeric type argument.
84 +--------------------------------------------------------------------------*/
85 static void Free_Numeric_Type(void * argp)
91 /*---------------------------------------------------------------------------
93 | Function : static bool Check_Numeric_Field(FIELD * field,
96 | Description : Validate buffer content to be a valid numeric value
98 | Return Values : TRUE - field is valid
99 | FALSE - field is invalid
100 +--------------------------------------------------------------------------*/
101 static bool Check_Numeric_Field(FIELD * field, const void * argp)
103 const numericARG *argn = (const numericARG *)argp;
104 double low = argn->low;
105 double high = argn->high;
106 int prec = argn->precision;
107 unsigned char *bp = (unsigned char *)field_buffer(field,0);
108 char *s = (char *)bp;
110 struct lconv* L = argn->L;
113 while(*bp && *bp==' ') bp++;
116 if (*bp=='-' || *bp=='+')
120 if (!isdigit(*bp)) break;
125 (L && L->decimal_point) ? *(L->decimal_point) :
132 if (!isdigit(*bp)) break;
136 while(*bp && *bp==' ') bp++;
142 if (val<low || val>high) return FALSE;
144 sprintf(buf,"%.*f",(prec>0?prec:0),val);
145 set_field_buffer(field,0,buf);
152 /*---------------------------------------------------------------------------
153 | Facility : libnform
154 | Function : static bool Check_Numeric_Character(
158 | Description : Check a character for the numeric type.
160 | Return Values : TRUE - character is valid
161 | FALSE - character is invalid
162 +--------------------------------------------------------------------------*/
163 static bool Check_Numeric_Character(int c, const void * argp)
165 const numericARG *argn = (const numericARG *)argp;
166 struct lconv* L = argn->L;
168 return (isdigit(c) ||
173 (L && L->decimal_point) ? *(L->decimal_point) :
179 static FIELDTYPE typeNUMERIC = {
180 _HAS_ARGS | _RESIDENT,
181 1, /* this is mutable, so we can't be const */
188 Check_Numeric_Character,
193 NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_NUMERIC = &typeNUMERIC;
195 /* fty_num.c ends here */