1/**************************************************************************** 2 * Copyright 2020 Thomas E. Dickey * 3 * Copyright 1998-2009,2010 Free Software Foundation, Inc. * 4 * * 5 * Permission is hereby granted, free of charge, to any person obtaining a * 6 * copy of this software and associated documentation files (the * 7 * "Software"), to deal in the Software without restriction, including * 8 * without limitation the rights to use, copy, modify, merge, publish, * 9 * distribute, distribute with modifications, sublicense, and/or sell * 10 * copies of the Software, and to permit persons to whom the Software is * 11 * furnished to do so, subject to the following conditions: * 12 * * 13 * The above copyright notice and this permission notice shall be included * 14 * in all copies or substantial portions of the Software. * 15 * * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 19 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 22 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 23 * * 24 * Except as contained in this notice, the name(s) of the above copyright * 25 * holders shall not be used in advertising or otherwise to promote the * 26 * sale, use or other dealings in this Software without prior written * 27 * authorization. * 28 ****************************************************************************/ 29 30/*************************************************************************** 31* * 32* Author : Juergen Pfeifer * 33* * 34***************************************************************************/ 35 36#include "form.priv.h" 37 38MODULE_ID("$Id: fty_alnum.c,v 1.29 2020/12/12 01:15:37 tom Exp $") 39 40#define thisARG alnumARG 41 42typedef struct 43 { 44 int width; 45 } 46thisARG; 47 48/*--------------------------------------------------------------------------- 49| Facility : libnform 50| Function : static void *Generic_This_Type(void *arg) 51| 52| Description : Allocate structure for alphanumeric type argument. 53| 54| Return Values : Pointer to argument structure or NULL on error 55+--------------------------------------------------------------------------*/ 56static void * 57Generic_This_Type(void *arg) 58{ 59 thisARG *argp = (thisARG *)0; 60 61 if (arg) 62 { 63 argp = typeMalloc(thisARG, 1); 64 65 if (argp) 66 { 67 T((T_CREATE("thisARG %p"), (void *)argp)); 68 argp->width = *((int *)arg); 69 } 70 } 71 return ((void *)argp); 72} 73 74/*--------------------------------------------------------------------------- 75| Facility : libnform 76| Function : static void *Make_This_Type(va_list *ap) 77| 78| Description : Allocate structure for alphanumeric type argument. 79| 80| Return Values : Pointer to argument structure or NULL on error 81+--------------------------------------------------------------------------*/ 82static void * 83Make_This_Type(va_list *ap) 84{ 85 int w = va_arg(*ap, int); 86 87 return Generic_This_Type((void *)&w); 88} 89 90/*--------------------------------------------------------------------------- 91| Facility : libnform 92| Function : static void *Copy_ThisType(const void *argp) 93| 94| Description : Copy structure for alphanumeric type argument. 95| 96| Return Values : Pointer to argument structure or NULL on error. 97+--------------------------------------------------------------------------*/ 98static void * 99Copy_This_Type(const void *argp) 100{ 101 const thisARG *ap = (const thisARG *)argp; 102 thisARG *result = typeMalloc(thisARG, 1); 103 104 if (result) 105 { 106 T((T_CREATE("thisARG %p"), (void *)result)); 107 *result = *ap; 108 } 109 110 return ((void *)result); 111} 112 113/*--------------------------------------------------------------------------- 114| Facility : libnform 115| Function : static void Free_This_Type(void *argp) 116| 117| Description : Free structure for alphanumeric type argument. 118| 119| Return Values : - 120+--------------------------------------------------------------------------*/ 121static void 122Free_This_Type(void *argp) 123{ 124 if (argp) 125 free(argp); 126} 127 128/*--------------------------------------------------------------------------- 129| Facility : libnform 130| Function : static bool Check_This_Character( 131| int c, 132| const void *argp) 133| 134| Description : Check a character for the alphanumeric type. 135| 136| Return Values : TRUE - character is valid 137| FALSE - character is invalid 138+--------------------------------------------------------------------------*/ 139static bool 140Check_This_Character(int c, const void *argp GCC_UNUSED) 141{ 142#if USE_WIDEC_SUPPORT 143 if (iswalnum((wint_t)c)) 144 return TRUE; 145#endif 146 return (isalnum(UChar(c)) ? TRUE : FALSE); 147} 148 149/*--------------------------------------------------------------------------- 150| Facility : libnform 151| Function : static bool Check_This_Field( 152| FIELD *field, 153| const void *argp) 154| 155| Description : Validate buffer content to be a valid alphanumeric value 156| 157| Return Values : TRUE - field is valid 158| FALSE - field is invalid 159+--------------------------------------------------------------------------*/ 160static bool 161Check_This_Field(FIELD *field, const void *argp) 162{ 163 int width = ((const thisARG *)argp)->width; 164 unsigned char *bp = (unsigned char *)field_buffer(field, 0); 165 bool result = (width < 0); 166 167 Check_CTYPE_Field(result, bp, width, Check_This_Character); 168 return (result); 169} 170 171static FIELDTYPE typeTHIS = 172{ 173 _HAS_ARGS | _RESIDENT, 174 1, /* this is mutable, so we can't be const */ 175 (FIELDTYPE *)0, 176 (FIELDTYPE *)0, 177 Make_This_Type, 178 Copy_This_Type, 179 Free_This_Type, 180 INIT_FT_FUNC(Check_This_Field), 181 INIT_FT_FUNC(Check_This_Character), 182 INIT_FT_FUNC(NULL), 183 INIT_FT_FUNC(NULL), 184#if NCURSES_INTEROP_FUNCS 185 Generic_This_Type 186#endif 187}; 188 189FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALNUM = &typeTHIS; 190 191#if NCURSES_INTEROP_FUNCS 192/* The next routines are to simplify the use of ncurses from 193 programming languages with restrictions on interop with C level 194 constructs (e.g. variable access or va_list + ellipsis constructs) 195*/ 196FORM_EXPORT(FIELDTYPE *) 197_nc_TYPE_ALNUM(void) 198{ 199 return TYPE_ALNUM; 200} 201#endif 202 203/* fty_alnum.c ends here */ 204