diff options
Diffstat (limited to 'lib/libform/fty_int.c')
-rw-r--r-- | lib/libform/fty_int.c | 208 |
1 files changed, 146 insertions, 62 deletions
diff --git a/lib/libform/fty_int.c b/lib/libform/fty_int.c index 5cc185e5e5c..7b7848608df 100644 --- a/lib/libform/fty_int.c +++ b/lib/libform/fty_int.c @@ -1,135 +1,217 @@ -/* $OpenBSD: fty_int.c,v 1.7 2003/04/05 13:41:43 espie Exp $ */ +/**************************************************************************** + * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ - -/* - * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT. - * You may freely copy it for use as a template for your own field types. - * If you develop a field type that might be of general use, please send - * it back to the ncurses maintainers for inclusion in the next version. - */ /*************************************************************************** * * -* Author : Juergen Pfeifer, juergen.pfeifer@gmx.net * +* Author : Juergen Pfeifer * * * ***************************************************************************/ #include "form.priv.h" -MODULE_ID("$From: fty_int.c,v 1.11 2000/12/09 23:46:12 tom Exp $") +MODULE_ID("$Id: fty_int.c,v 1.8 2010/01/12 23:22:07 nicm Exp $") + +#if USE_WIDEC_SUPPORT +#define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c))) +#else +#define isDigit(c) isdigit(UChar(c)) +#endif -typedef struct { - int precision; - long low; - long high; -} integerARG; +#define thisARG integerARG + +typedef struct + { + int precision; + long low; + long high; + } +thisARG; /*--------------------------------------------------------------------------- | Facility : libnform -| Function : static void *Make_Integer_Type( va_list * ap ) +| Function : static void *Make_This_Type( va_list * ap ) | | Description : Allocate structure for integer type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ -static void *Make_Integer_Type(va_list * ap) +static void * +Make_This_Type(va_list *ap) { - integerARG *argp = (integerARG *)malloc(sizeof(integerARG)); + thisARG *argp = typeMalloc(thisARG, 1); if (argp) { - argp->precision = va_arg(*ap,int); - argp->low = va_arg(*ap,long); - argp->high = va_arg(*ap,long); + T((T_CREATE("thisARG %p"), argp)); + argp->precision = va_arg(*ap, int); + argp->low = va_arg(*ap, long); + argp->high = va_arg(*ap, long); } return (void *)argp; } /*--------------------------------------------------------------------------- | Facility : libnform -| Function : static void *Copy_Integer_Type(const void * argp) +| Function : static void *Copy_This_Type(const void * argp) | | Description : Copy structure for integer type argument. | | Return Values : Pointer to argument structure or NULL on error. +--------------------------------------------------------------------------*/ -static void *Copy_Integer_Type(const void * argp) +static void * +Copy_This_Type(const void *argp) { - const integerARG *ap = (const integerARG *)argp; - integerARG *result = (integerARG *)0; + const thisARG *ap = (const thisARG *)argp; + thisARG *result = (thisARG *) 0; if (argp) { - result = (integerARG *)malloc(sizeof(integerARG)); + result = typeMalloc(thisARG, 1); if (result) - *result = *ap; + { + T((T_CREATE("thisARG %p"), result)); + *result = *ap; + } } return (void *)result; } /*--------------------------------------------------------------------------- | Facility : libnform -| Function : static void Free_Integer_Type(void * argp) +| Function : static void Free_This_Type(void * argp) | | Description : Free structure for integer type argument. | | Return Values : - +--------------------------------------------------------------------------*/ -static void Free_Integer_Type(void * argp) +static void +Free_This_Type(void *argp) { - if (argp) + if (argp) free(argp); } /*--------------------------------------------------------------------------- | Facility : libnform -| Function : static bool Check_Integer_Field( -| FIELD * field, -| const void * argp) +| Function : static bool Check_This_Field( +| FIELD * field, +| const void * argp) | | Description : Validate buffer content to be a valid integer value | | Return Values : TRUE - field is valid | FALSE - field is invalid +--------------------------------------------------------------------------*/ -static bool Check_Integer_Field(FIELD * field, const void * argp) +static bool +Check_This_Field(FIELD *field, const void *argp) { - const integerARG *argi = (const integerARG *)argp; - long low = argi->low; - long high = argi->high; - int prec = argi->precision; - unsigned char *bp = (unsigned char *)field_buffer(field,0); - char *s = (char *)bp; + const thisARG *argi = (const thisARG *)argp; + long low = argi->low; + long high = argi->high; + int prec = argi->precision; + unsigned char *bp = (unsigned char *)field_buffer(field, 0); + char *s = (char *)bp; long val; char buf[100]; + bool result = FALSE; - while( *bp && *bp==' ') bp++; + while (*bp && *bp == ' ') + bp++; if (*bp) { - if (*bp=='-') bp++; + if (*bp == '-') + bp++; +#if USE_WIDEC_SUPPORT + if (*bp) + { + bool blank = FALSE; + int len; + int n; + wchar_t *list = _nc_Widen_String((char *)bp, &len); + + if (list != 0) + { + result = TRUE; + for (n = 0; n < len; ++n) + { + if (blank) + { + if (list[n] != ' ') + { + result = FALSE; + break; + } + } + else if (list[n] == ' ') + { + blank = TRUE; + } + else if (!isDigit(list[n])) + { + result = FALSE; + break; + } + } + free(list); + } + } +#else while (*bp) { - if (!isdigit(*bp)) break; + if (!isdigit(UChar(*bp))) + break; bp++; } - while(*bp && *bp==' ') bp++; - if (*bp=='\0') + while (*bp && *bp == ' ') + bp++; + result = (*bp == '\0'); +#endif + if (result) { val = atol(s); - if (low<high) + if (low < high) { - if (val<low || val>high) return FALSE; + if (val < low || val > high) + result = FALSE; + } + if (result) + { + snprintf(buf, sizeof(buf), "%.*ld", (prec > 0 ? prec : 0), val); + set_field_buffer(field, 0, buf); } - snprintf(buf, sizeof(buf), "%.*ld",(prec>0?prec:0),val); - set_field_buffer(field,0,buf); - return TRUE; } } - return FALSE; + return (result); } /*--------------------------------------------------------------------------- | Facility : libnform -| Function : static bool Check_Integer_Character( +| Function : static bool Check_This_Character( | int c, | const void * argp) | @@ -138,25 +220,27 @@ static bool Check_Integer_Field(FIELD * field, const void * argp) | Return Values : TRUE - character is valid | FALSE - character is invalid +--------------------------------------------------------------------------*/ -static bool Check_Integer_Character(int c, const void * argp GCC_UNUSED) +static bool +Check_This_Character(int c, const void *argp GCC_UNUSED) { - return ((isdigit(c) || (c=='-')) ? TRUE : FALSE); + return ((isDigit(UChar(c)) || (c == '-')) ? TRUE : FALSE); } -static FIELDTYPE typeINTEGER = { +static FIELDTYPE typeTHIS = +{ _HAS_ARGS | _RESIDENT, - 1, /* this is mutable, so we can't be const */ + 1, /* this is mutable, so we can't be const */ (FIELDTYPE *)0, (FIELDTYPE *)0, - Make_Integer_Type, - Copy_Integer_Type, - Free_Integer_Type, - Check_Integer_Field, - Check_Integer_Character, + Make_This_Type, + Copy_This_Type, + Free_This_Type, + Check_This_Field, + Check_This_Character, NULL, NULL }; -NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_INTEGER = &typeINTEGER; +NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_INTEGER = &typeTHIS; /* fty_int.c ends here */ |