1/* 2 * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT. 3 * You may freely copy it for use as a template for your own field types. 4 * If you develop a field type that might be of general use, please send 5 * it back to the ncurses maintainers for inclusion in the next version. 6 */ 7/*************************************************************************** 8* * 9* Author : Juergen Pfeifer * 10* * 11***************************************************************************/ 12 13#include "form.priv.h" 14 15MODULE_ID("$Id: fty_alnum.c,v 1.18 2005/08/20 18:26:16 tom Exp $") 16 17#define thisARG alnumARG 18 19typedef struct 20 { 21 int width; 22 } 23thisARG; 24 25/*--------------------------------------------------------------------------- 26| Facility : libnform 27| Function : static void *Make_This_Type(va_list *ap) 28| 29| Description : Allocate structure for alphanumeric type argument. 30| 31| Return Values : Pointer to argument structure or NULL on error 32+--------------------------------------------------------------------------*/ 33static void * 34Make_This_Type(va_list *ap) 35{ 36 thisARG *argp = (thisARG *) malloc(sizeof(thisARG)); 37 38 if (argp) 39 argp->width = va_arg(*ap, int); 40 41 return ((void *)argp); 42} 43 44/*--------------------------------------------------------------------------- 45| Facility : libnform 46| Function : static void *Copy_ThisType(const void *argp) 47| 48| Description : Copy structure for alphanumeric type argument. 49| 50| Return Values : Pointer to argument structure or NULL on error. 51+--------------------------------------------------------------------------*/ 52static void * 53Copy_This_Type(const void *argp) 54{ 55 const thisARG *ap = (const thisARG *)argp; 56 thisARG *result = (thisARG *) malloc(sizeof(thisARG)); 57 58 if (result) 59 *result = *ap; 60 61 return ((void *)result); 62} 63 64/*--------------------------------------------------------------------------- 65| Facility : libnform 66| Function : static void Free_This_Type(void *argp) 67| 68| Description : Free structure for alphanumeric type argument. 69| 70| Return Values : - 71+--------------------------------------------------------------------------*/ 72static void 73Free_This_Type(void *argp) 74{ 75 if (argp) 76 free(argp); 77} 78 79/*--------------------------------------------------------------------------- 80| Facility : libnform 81| Function : static bool Check_This_Character( 82| int c, 83| const void *argp) 84| 85| Description : Check a character for the alphanumeric type. 86| 87| Return Values : TRUE - character is valid 88| FALSE - character is invalid 89+--------------------------------------------------------------------------*/ 90static bool 91Check_This_Character(int c, const void *argp GCC_UNUSED) 92{ 93#if USE_WIDEC_SUPPORT 94 if (iswalnum((wint_t) c)) 95 return TRUE; 96#endif 97 return (isalnum(UChar(c)) ? TRUE : FALSE); 98} 99 100/*--------------------------------------------------------------------------- 101| Facility : libnform 102| Function : static bool Check_This_Field( 103| FIELD *field, 104| const void *argp) 105| 106| Description : Validate buffer content to be a valid alphanumeric value 107| 108| Return Values : TRUE - field is valid 109| FALSE - field is invalid 110+--------------------------------------------------------------------------*/ 111static bool 112Check_This_Field(FIELD *field, const void *argp) 113{ 114 int width = ((const thisARG *)argp)->width; 115 unsigned char *bp = (unsigned char *)field_buffer(field, 0); 116 bool result = (width < 0); 117 118 Check_CTYPE_Field(result, bp, width, Check_This_Character); 119 return (result); 120} 121 122static FIELDTYPE typeTHIS = 123{ 124 _HAS_ARGS | _RESIDENT, 125 1, /* this is mutable, so we can't be const */ 126 (FIELDTYPE *)0, 127 (FIELDTYPE *)0, 128 Make_This_Type, 129 Copy_This_Type, 130 Free_This_Type, 131 Check_This_Field, 132 Check_This_Character, 133 NULL, 134 NULL 135}; 136 137NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_ALNUM = &typeTHIS; 138 139/* fty_alnum.c ends here */ 140