X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffty_alnum.c;h=cda23dc2b653d3d44abe00e20ecd56ac88ce6782;hp=5f358042d0c004dd2e0f5dc47bf9d45521f1288b;hb=8d8a3537cd58af7879c6e1921235daeed2b74926;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/form/fty_alnum.c b/form/fty_alnum.c index 5f358042..cda23dc2 100644 --- a/form/fty_alnum.c +++ b/form/fty_alnum.c @@ -1,137 +1,202 @@ +/**************************************************************************** + * Copyright (c) 1998-2009,2010 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@T-Online.de * +* Author : Juergen Pfeifer * * * ***************************************************************************/ #include "form.priv.h" -MODULE_ID("$Id: fty_alnum.c,v 1.6 1997/02/15 17:31:21 tom Exp $") +MODULE_ID("$Id: fty_alnum.c,v 1.24 2010/01/23 21:14:36 tom Exp $") -typedef struct { - int width; -} alnumARG; +#define thisARG alnumARG + +typedef struct + { + int width; + } +thisARG; /*--------------------------------------------------------------------------- -| Facility : libnform -| Function : static void *Make_AlphaNumeric_Type(va_list *ap) -| +| Facility : libnform +| Function : static void *Generic_This_Type(void *arg) +| | Description : Allocate structure for alphanumeric type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ -static void *Make_AlphaNumeric_Type(va_list * ap) +static void * +Generic_This_Type(void *arg) { - alnumARG *argp = (alnumARG *)malloc(sizeof(alnumARG)); + thisARG *argp = (thisARG *) 0; - if (argp) - argp->width = va_arg(*ap,int); + if (arg) + { + argp = typeMalloc(thisARG, 1); + if (argp) + { + T((T_CREATE("thisARG %p"), (void *)argp)); + argp->width = *((int *)arg); + } + } return ((void *)argp); } /*--------------------------------------------------------------------------- -| Facility : libnform -| Function : static void *Copy_AlphaNumericType(const void *argp) -| -| Description : Copy structure for alphanumeric type argument. +| Facility : libnform +| Function : static void *Make_This_Type(va_list *ap) +| +| Description : Allocate structure for alphanumeric type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_This_Type(va_list *ap) +{ + int w = va_arg(*ap, int); + + return Generic_This_Type((void *)&w); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Copy_ThisType(const void *argp) +| +| Description : Copy structure for alphanumeric type argument. | | Return Values : Pointer to argument structure or NULL on error. +--------------------------------------------------------------------------*/ -static void *Copy_AlphaNumeric_Type(const void *argp) +static void * +Copy_This_Type(const void *argp) { - const alnumARG *ap = (const alnumARG *)argp; - alnumARG *new = (alnumARG *)malloc(sizeof(alnumARG)); + const thisARG *ap = (const thisARG *)argp; + thisARG *result = typeMalloc(thisARG, 1); - if (new) - *new = *ap; + if (result) + { + T((T_CREATE("thisARG %p"), (void *)result)); + *result = *ap; + } - return ((void *)new); + return ((void *)result); } /*--------------------------------------------------------------------------- -| Facility : libnform -| Function : static void Free_AlphaNumeric_Type(void *argp) -| +| Facility : libnform +| Function : static void Free_This_Type(void *argp) +| | Description : Free structure for alphanumeric type argument. | | Return Values : - +--------------------------------------------------------------------------*/ -static void Free_AlphaNumeric_Type(void * argp) +static void +Free_This_Type(void *argp) { - if (argp) + if (argp) free(argp); } /*--------------------------------------------------------------------------- -| Facility : libnform -| Function : static bool Check_AlphaNumeric_Field( -| FIELD *field, +| Facility : libnform +| Function : static bool Check_This_Character( +| int c, | const void *argp) -| -| Description : Validate buffer content to be a valid alphanumeric value | -| Return Values : TRUE - field is valid -| FALSE - field is invalid +| Description : Check a character for the alphanumeric type. +| +| Return Values : TRUE - character is valid +| FALSE - character is invalid +--------------------------------------------------------------------------*/ -static bool Check_AlphaNumeric_Field(FIELD * field, const void * argp) +static bool +Check_This_Character(int c, const void *argp GCC_UNUSED) { - int width = ((const alnumARG *)argp)->width; - unsigned char *bp = (unsigned char *)field_buffer(field,0); - int l = -1; - unsigned char *s; - - while(*bp && *bp==' ') - bp++; - if (*bp) - { - s = bp; - while(*bp && isalnum(*bp)) - bp++; - l = (int)(bp-s); - while(*bp && *bp==' ') - bp++; - } - return ((*bp || (l < width)) ? FALSE : TRUE); +#if USE_WIDEC_SUPPORT + if (iswalnum((wint_t) c)) + return TRUE; +#endif + return (isalnum(UChar(c)) ? TRUE : FALSE); } /*--------------------------------------------------------------------------- -| Facility : libnform -| Function : static bool Check_AlphaNumeric_Character( -| int c, -| const void *argp ) -| -| Description : Check a character for the alphanumeric type. +| Facility : libnform +| Function : static bool Check_This_Field( +| FIELD *field, +| const void *argp) | -| Return Values : TRUE - character is valid -| FALSE - character is invalid +| Description : Validate buffer content to be a valid alphanumeric value +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid +--------------------------------------------------------------------------*/ -static bool Check_AlphaNumeric_Character(int c, const void * argp GCC_UNUSED) +static bool +Check_This_Field(FIELD *field, const void *argp) { - return (isalnum(c) ? TRUE : FALSE); + int width = ((const thisARG *)argp)->width; + unsigned char *bp = (unsigned char *)field_buffer(field, 0); + bool result = (width < 0); + + Check_CTYPE_Field(result, bp, width, Check_This_Character); + return (result); } -static FIELDTYPE typeALNUM = { +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_AlphaNumeric_Type, - Copy_AlphaNumeric_Type, - Free_AlphaNumeric_Type, - Check_AlphaNumeric_Field, - Check_AlphaNumeric_Character, - NULL, - NULL + Make_This_Type, + Copy_This_Type, + Free_This_Type, + INIT_FT_FUNC(Check_This_Field), + INIT_FT_FUNC(Check_This_Character), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_This_Type +#endif }; -FIELDTYPE* TYPE_ALNUM = &typeALNUM; +NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_ALNUM = &typeTHIS; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +NCURSES_EXPORT(FIELDTYPE *) +_nc_TYPE_ALNUM(void) +{ + return TYPE_ALNUM; +} +#endif /* fty_alnum.c ends here */