fty_int.c revision 174993
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