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 */