14a1a9510SRong-En Fan /**************************************************************************** 2*e1865124SBaptiste Daroussin * Copyright 2020 Thomas E. Dickey * 3*e1865124SBaptiste Daroussin * Copyright 1998-2009,2010 Free Software Foundation, Inc. * 44a1a9510SRong-En Fan * * 54a1a9510SRong-En Fan * Permission is hereby granted, free of charge, to any person obtaining a * 64a1a9510SRong-En Fan * copy of this software and associated documentation files (the * 74a1a9510SRong-En Fan * "Software"), to deal in the Software without restriction, including * 84a1a9510SRong-En Fan * without limitation the rights to use, copy, modify, merge, publish, * 94a1a9510SRong-En Fan * distribute, distribute with modifications, sublicense, and/or sell * 104a1a9510SRong-En Fan * copies of the Software, and to permit persons to whom the Software is * 114a1a9510SRong-En Fan * furnished to do so, subject to the following conditions: * 124a1a9510SRong-En Fan * * 134a1a9510SRong-En Fan * The above copyright notice and this permission notice shall be included * 144a1a9510SRong-En Fan * in all copies or substantial portions of the Software. * 154a1a9510SRong-En Fan * * 164a1a9510SRong-En Fan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 174a1a9510SRong-En Fan * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 184a1a9510SRong-En Fan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 194a1a9510SRong-En Fan * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 204a1a9510SRong-En Fan * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 214a1a9510SRong-En Fan * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 224a1a9510SRong-En Fan * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 234a1a9510SRong-En Fan * * 244a1a9510SRong-En Fan * Except as contained in this notice, the name(s) of the above copyright * 254a1a9510SRong-En Fan * holders shall not be used in advertising or otherwise to promote the * 264a1a9510SRong-En Fan * sale, use or other dealings in this Software without prior written * 274a1a9510SRong-En Fan * authorization. * 284a1a9510SRong-En Fan ****************************************************************************/ 290e3d5408SPeter Wemm 300e3d5408SPeter Wemm /*************************************************************************** 310e3d5408SPeter Wemm * * 324a1a9510SRong-En Fan * Author : Juergen Pfeifer * 330e3d5408SPeter Wemm * * 340e3d5408SPeter Wemm ***************************************************************************/ 350e3d5408SPeter Wemm 360e3d5408SPeter Wemm #include "form.priv.h" 370e3d5408SPeter Wemm 38*e1865124SBaptiste Daroussin MODULE_ID("$Id: fty_alnum.c,v 1.25 2020/02/02 23:34:34 tom Exp $") 390e3d5408SPeter Wemm 404a1a9510SRong-En Fan #define thisARG alnumARG 414a1a9510SRong-En Fan 424a1a9510SRong-En Fan typedef struct 434a1a9510SRong-En Fan { 440e3d5408SPeter Wemm int width; 454a1a9510SRong-En Fan } 464a1a9510SRong-En Fan thisARG; 470e3d5408SPeter Wemm 480e3d5408SPeter Wemm /*--------------------------------------------------------------------------- 490e3d5408SPeter Wemm | Facility : libnform 5006bfebdeSXin LI | Function : static void *Generic_This_Type(void *arg) 5106bfebdeSXin LI | 5206bfebdeSXin LI | Description : Allocate structure for alphanumeric type argument. 5306bfebdeSXin LI | 5406bfebdeSXin LI | Return Values : Pointer to argument structure or NULL on error 5506bfebdeSXin LI +--------------------------------------------------------------------------*/ 5606bfebdeSXin LI static void * 5706bfebdeSXin LI Generic_This_Type(void *arg) 5806bfebdeSXin LI { 5906bfebdeSXin LI thisARG *argp = (thisARG *) 0; 6006bfebdeSXin LI 6106bfebdeSXin LI if (arg) 6206bfebdeSXin LI { 6306bfebdeSXin LI argp = typeMalloc(thisARG, 1); 6406bfebdeSXin LI 6506bfebdeSXin LI if (argp) 6606bfebdeSXin LI { 6706bfebdeSXin LI T((T_CREATE("thisARG %p"), (void *)argp)); 6806bfebdeSXin LI argp->width = *((int *)arg); 6906bfebdeSXin LI } 7006bfebdeSXin LI } 7106bfebdeSXin LI return ((void *)argp); 7206bfebdeSXin LI } 7306bfebdeSXin LI 7406bfebdeSXin LI /*--------------------------------------------------------------------------- 7506bfebdeSXin LI | Facility : libnform 764a1a9510SRong-En Fan | Function : static void *Make_This_Type(va_list *ap) 770e3d5408SPeter Wemm | 780e3d5408SPeter Wemm | Description : Allocate structure for alphanumeric type argument. 790e3d5408SPeter Wemm | 800e3d5408SPeter Wemm | Return Values : Pointer to argument structure or NULL on error 810e3d5408SPeter Wemm +--------------------------------------------------------------------------*/ 824a1a9510SRong-En Fan static void * 834a1a9510SRong-En Fan Make_This_Type(va_list *ap) 840e3d5408SPeter Wemm { 8506bfebdeSXin LI int w = va_arg(*ap, int); 860e3d5408SPeter Wemm 8706bfebdeSXin LI return Generic_This_Type((void *)&w); 880e3d5408SPeter Wemm } 890e3d5408SPeter Wemm 900e3d5408SPeter Wemm /*--------------------------------------------------------------------------- 910e3d5408SPeter Wemm | Facility : libnform 924a1a9510SRong-En Fan | Function : static void *Copy_ThisType(const void *argp) 930e3d5408SPeter Wemm | 940e3d5408SPeter Wemm | Description : Copy structure for alphanumeric type argument. 950e3d5408SPeter Wemm | 960e3d5408SPeter Wemm | Return Values : Pointer to argument structure or NULL on error. 970e3d5408SPeter Wemm +--------------------------------------------------------------------------*/ 984a1a9510SRong-En Fan static void * 994a1a9510SRong-En Fan Copy_This_Type(const void *argp) 1000e3d5408SPeter Wemm { 1014a1a9510SRong-En Fan const thisARG *ap = (const thisARG *)argp; 1025ca44d1cSRong-En Fan thisARG *result = typeMalloc(thisARG, 1); 1030e3d5408SPeter Wemm 1040e3d5408SPeter Wemm if (result) 1055ca44d1cSRong-En Fan { 10606bfebdeSXin LI T((T_CREATE("thisARG %p"), (void *)result)); 1070e3d5408SPeter Wemm *result = *ap; 1085ca44d1cSRong-En Fan } 1090e3d5408SPeter Wemm 1100e3d5408SPeter Wemm return ((void *)result); 1110e3d5408SPeter Wemm } 1120e3d5408SPeter Wemm 1130e3d5408SPeter Wemm /*--------------------------------------------------------------------------- 1140e3d5408SPeter Wemm | Facility : libnform 1154a1a9510SRong-En Fan | Function : static void Free_This_Type(void *argp) 1160e3d5408SPeter Wemm | 1170e3d5408SPeter Wemm | Description : Free structure for alphanumeric type argument. 1180e3d5408SPeter Wemm | 1190e3d5408SPeter Wemm | Return Values : - 1200e3d5408SPeter Wemm +--------------------------------------------------------------------------*/ 1214a1a9510SRong-En Fan static void 1224a1a9510SRong-En Fan Free_This_Type(void *argp) 1230e3d5408SPeter Wemm { 1240e3d5408SPeter Wemm if (argp) 1250e3d5408SPeter Wemm free(argp); 1260e3d5408SPeter Wemm } 1270e3d5408SPeter Wemm 1280e3d5408SPeter Wemm /*--------------------------------------------------------------------------- 1290e3d5408SPeter Wemm | Facility : libnform 1304a1a9510SRong-En Fan | Function : static bool Check_This_Character( 1310e3d5408SPeter Wemm | int c, 1320e3d5408SPeter Wemm | const void *argp) 1330e3d5408SPeter Wemm | 1340e3d5408SPeter Wemm | Description : Check a character for the alphanumeric type. 1350e3d5408SPeter Wemm | 1360e3d5408SPeter Wemm | Return Values : TRUE - character is valid 1370e3d5408SPeter Wemm | FALSE - character is invalid 1380e3d5408SPeter Wemm +--------------------------------------------------------------------------*/ 1394a1a9510SRong-En Fan static bool 1404a1a9510SRong-En Fan Check_This_Character(int c, const void *argp GCC_UNUSED) 1410e3d5408SPeter Wemm { 1424a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT 1434a1a9510SRong-En Fan if (iswalnum((wint_t) c)) 1444a1a9510SRong-En Fan return TRUE; 1454a1a9510SRong-En Fan #endif 1464a1a9510SRong-En Fan return (isalnum(UChar(c)) ? TRUE : FALSE); 1470e3d5408SPeter Wemm } 1480e3d5408SPeter Wemm 1494a1a9510SRong-En Fan /*--------------------------------------------------------------------------- 1504a1a9510SRong-En Fan | Facility : libnform 1514a1a9510SRong-En Fan | Function : static bool Check_This_Field( 1524a1a9510SRong-En Fan | FIELD *field, 1534a1a9510SRong-En Fan | const void *argp) 1544a1a9510SRong-En Fan | 1554a1a9510SRong-En Fan | Description : Validate buffer content to be a valid alphanumeric value 1564a1a9510SRong-En Fan | 1574a1a9510SRong-En Fan | Return Values : TRUE - field is valid 1584a1a9510SRong-En Fan | FALSE - field is invalid 1594a1a9510SRong-En Fan +--------------------------------------------------------------------------*/ 1604a1a9510SRong-En Fan static bool 1614a1a9510SRong-En Fan Check_This_Field(FIELD *field, const void *argp) 1624a1a9510SRong-En Fan { 1634a1a9510SRong-En Fan int width = ((const thisARG *)argp)->width; 1644a1a9510SRong-En Fan unsigned char *bp = (unsigned char *)field_buffer(field, 0); 1654a1a9510SRong-En Fan bool result = (width < 0); 1664a1a9510SRong-En Fan 1674a1a9510SRong-En Fan Check_CTYPE_Field(result, bp, width, Check_This_Character); 1684a1a9510SRong-En Fan return (result); 1694a1a9510SRong-En Fan } 1704a1a9510SRong-En Fan 1714a1a9510SRong-En Fan static FIELDTYPE typeTHIS = 1724a1a9510SRong-En Fan { 1730e3d5408SPeter Wemm _HAS_ARGS | _RESIDENT, 1740e3d5408SPeter Wemm 1, /* this is mutable, so we can't be const */ 1750e3d5408SPeter Wemm (FIELDTYPE *)0, 1760e3d5408SPeter Wemm (FIELDTYPE *)0, 1774a1a9510SRong-En Fan Make_This_Type, 1784a1a9510SRong-En Fan Copy_This_Type, 1794a1a9510SRong-En Fan Free_This_Type, 18006bfebdeSXin LI INIT_FT_FUNC(Check_This_Field), 18106bfebdeSXin LI INIT_FT_FUNC(Check_This_Character), 18206bfebdeSXin LI INIT_FT_FUNC(NULL), 18306bfebdeSXin LI INIT_FT_FUNC(NULL), 18406bfebdeSXin LI #if NCURSES_INTEROP_FUNCS 18506bfebdeSXin LI Generic_This_Type 18606bfebdeSXin LI #endif 1870e3d5408SPeter Wemm }; 1880e3d5408SPeter Wemm 1894a1a9510SRong-En Fan NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_ALNUM = &typeTHIS; 1900e3d5408SPeter Wemm 19106bfebdeSXin LI #if NCURSES_INTEROP_FUNCS 19206bfebdeSXin LI /* The next routines are to simplify the use of ncurses from 19306bfebdeSXin LI programming languages with restictions on interop with C level 19406bfebdeSXin LI constructs (e.g. variable access or va_list + ellipsis constructs) 19506bfebdeSXin LI */ 19606bfebdeSXin LI NCURSES_EXPORT(FIELDTYPE *) 19706bfebdeSXin LI _nc_TYPE_ALNUM(void) 19806bfebdeSXin LI { 19906bfebdeSXin LI return TYPE_ALNUM; 20006bfebdeSXin LI } 20106bfebdeSXin LI #endif 20206bfebdeSXin LI 2030e3d5408SPeter Wemm /* fty_alnum.c ends here */ 204