xref: /freebsd/contrib/ncurses/form/fty_alnum.c (revision 5ca44d1c915a0e0c87f8f347e61f7bfa65d609af)
14a1a9510SRong-En Fan /****************************************************************************
25ca44d1cSRong-En Fan  * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc.              *
34a1a9510SRong-En Fan  *                                                                          *
44a1a9510SRong-En Fan  * Permission is hereby granted, free of charge, to any person obtaining a  *
54a1a9510SRong-En Fan  * copy of this software and associated documentation files (the            *
64a1a9510SRong-En Fan  * "Software"), to deal in the Software without restriction, including      *
74a1a9510SRong-En Fan  * without limitation the rights to use, copy, modify, merge, publish,      *
84a1a9510SRong-En Fan  * distribute, distribute with modifications, sublicense, and/or sell       *
94a1a9510SRong-En Fan  * copies of the Software, and to permit persons to whom the Software is    *
104a1a9510SRong-En Fan  * furnished to do so, subject to the following conditions:                 *
114a1a9510SRong-En Fan  *                                                                          *
124a1a9510SRong-En Fan  * The above copyright notice and this permission notice shall be included  *
134a1a9510SRong-En Fan  * in all copies or substantial portions of the Software.                   *
144a1a9510SRong-En Fan  *                                                                          *
154a1a9510SRong-En Fan  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
164a1a9510SRong-En Fan  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
174a1a9510SRong-En Fan  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
184a1a9510SRong-En Fan  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
194a1a9510SRong-En Fan  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
204a1a9510SRong-En Fan  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
214a1a9510SRong-En Fan  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
224a1a9510SRong-En Fan  *                                                                          *
234a1a9510SRong-En Fan  * Except as contained in this notice, the name(s) of the above copyright   *
244a1a9510SRong-En Fan  * holders shall not be used in advertising or otherwise to promote the     *
254a1a9510SRong-En Fan  * sale, use or other dealings in this Software without prior written       *
264a1a9510SRong-En Fan  * authorization.                                                           *
274a1a9510SRong-En Fan  ****************************************************************************/
280e3d5408SPeter Wemm 
290e3d5408SPeter Wemm /***************************************************************************
300e3d5408SPeter Wemm *                                                                          *
314a1a9510SRong-En Fan *  Author : Juergen Pfeifer                                                *
320e3d5408SPeter Wemm *                                                                          *
330e3d5408SPeter Wemm ***************************************************************************/
340e3d5408SPeter Wemm 
350e3d5408SPeter Wemm #include "form.priv.h"
360e3d5408SPeter Wemm 
375ca44d1cSRong-En Fan MODULE_ID("$Id: fty_alnum.c,v 1.21 2007/10/13 19:31:52 tom Exp $")
380e3d5408SPeter Wemm 
394a1a9510SRong-En Fan #define thisARG alnumARG
404a1a9510SRong-En Fan 
414a1a9510SRong-En Fan typedef struct
424a1a9510SRong-En Fan   {
430e3d5408SPeter Wemm     int width;
444a1a9510SRong-En Fan   }
454a1a9510SRong-En Fan thisARG;
460e3d5408SPeter Wemm 
470e3d5408SPeter Wemm /*---------------------------------------------------------------------------
480e3d5408SPeter Wemm |   Facility      :  libnform
494a1a9510SRong-En Fan |   Function      :  static void *Make_This_Type(va_list *ap)
500e3d5408SPeter Wemm |
510e3d5408SPeter Wemm |   Description   :  Allocate structure for alphanumeric type argument.
520e3d5408SPeter Wemm |
530e3d5408SPeter Wemm |   Return Values :  Pointer to argument structure or NULL on error
540e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
554a1a9510SRong-En Fan static void *
564a1a9510SRong-En Fan Make_This_Type(va_list *ap)
570e3d5408SPeter Wemm {
585ca44d1cSRong-En Fan   thisARG *argp = typeMalloc(thisARG, 1);
590e3d5408SPeter Wemm 
600e3d5408SPeter Wemm   if (argp)
615ca44d1cSRong-En Fan     {
625ca44d1cSRong-En Fan       T((T_CREATE("thisARG %p"), argp));
630e3d5408SPeter Wemm       argp->width = va_arg(*ap, int);
645ca44d1cSRong-En Fan     }
650e3d5408SPeter Wemm 
660e3d5408SPeter Wemm   return ((void *)argp);
670e3d5408SPeter Wemm }
680e3d5408SPeter Wemm 
690e3d5408SPeter Wemm /*---------------------------------------------------------------------------
700e3d5408SPeter Wemm |   Facility      :  libnform
714a1a9510SRong-En Fan |   Function      :  static void *Copy_ThisType(const void *argp)
720e3d5408SPeter Wemm |
730e3d5408SPeter Wemm |   Description   :  Copy structure for alphanumeric type argument.
740e3d5408SPeter Wemm |
750e3d5408SPeter Wemm |   Return Values :  Pointer to argument structure or NULL on error.
760e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
774a1a9510SRong-En Fan static void *
784a1a9510SRong-En Fan Copy_This_Type(const void *argp)
790e3d5408SPeter Wemm {
804a1a9510SRong-En Fan   const thisARG *ap = (const thisARG *)argp;
815ca44d1cSRong-En Fan   thisARG *result = typeMalloc(thisARG, 1);
820e3d5408SPeter Wemm 
830e3d5408SPeter Wemm   if (result)
845ca44d1cSRong-En Fan     {
855ca44d1cSRong-En Fan       T((T_CREATE("thisARG %p"), result));
860e3d5408SPeter Wemm       *result = *ap;
875ca44d1cSRong-En Fan     }
880e3d5408SPeter Wemm 
890e3d5408SPeter Wemm   return ((void *)result);
900e3d5408SPeter Wemm }
910e3d5408SPeter Wemm 
920e3d5408SPeter Wemm /*---------------------------------------------------------------------------
930e3d5408SPeter Wemm |   Facility      :  libnform
944a1a9510SRong-En Fan |   Function      :  static void Free_This_Type(void *argp)
950e3d5408SPeter Wemm |
960e3d5408SPeter Wemm |   Description   :  Free structure for alphanumeric type argument.
970e3d5408SPeter Wemm |
980e3d5408SPeter Wemm |   Return Values :  -
990e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1004a1a9510SRong-En Fan static void
1014a1a9510SRong-En Fan Free_This_Type(void *argp)
1020e3d5408SPeter Wemm {
1030e3d5408SPeter Wemm   if (argp)
1040e3d5408SPeter Wemm     free(argp);
1050e3d5408SPeter Wemm }
1060e3d5408SPeter Wemm 
1070e3d5408SPeter Wemm /*---------------------------------------------------------------------------
1080e3d5408SPeter Wemm |   Facility      :  libnform
1094a1a9510SRong-En Fan |   Function      :  static bool Check_This_Character(
1100e3d5408SPeter Wemm |                                      int c,
1110e3d5408SPeter Wemm |                                      const void *argp)
1120e3d5408SPeter Wemm |
1130e3d5408SPeter Wemm |   Description   :  Check a character for the alphanumeric type.
1140e3d5408SPeter Wemm |
1150e3d5408SPeter Wemm |   Return Values :  TRUE  - character is valid
1160e3d5408SPeter Wemm |                    FALSE - character is invalid
1170e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1184a1a9510SRong-En Fan static bool
1194a1a9510SRong-En Fan Check_This_Character(int c, const void *argp GCC_UNUSED)
1200e3d5408SPeter Wemm {
1214a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
1224a1a9510SRong-En Fan   if (iswalnum((wint_t) c))
1234a1a9510SRong-En Fan     return TRUE;
1244a1a9510SRong-En Fan #endif
1254a1a9510SRong-En Fan   return (isalnum(UChar(c)) ? TRUE : FALSE);
1260e3d5408SPeter Wemm }
1270e3d5408SPeter Wemm 
1284a1a9510SRong-En Fan /*---------------------------------------------------------------------------
1294a1a9510SRong-En Fan |   Facility      :  libnform
1304a1a9510SRong-En Fan |   Function      :  static bool Check_This_Field(
1314a1a9510SRong-En Fan |                                      FIELD *field,
1324a1a9510SRong-En Fan |                                      const void *argp)
1334a1a9510SRong-En Fan |
1344a1a9510SRong-En Fan |   Description   :  Validate buffer content to be a valid alphanumeric value
1354a1a9510SRong-En Fan |
1364a1a9510SRong-En Fan |   Return Values :  TRUE  - field is valid
1374a1a9510SRong-En Fan |                    FALSE - field is invalid
1384a1a9510SRong-En Fan +--------------------------------------------------------------------------*/
1394a1a9510SRong-En Fan static bool
1404a1a9510SRong-En Fan Check_This_Field(FIELD *field, const void *argp)
1414a1a9510SRong-En Fan {
1424a1a9510SRong-En Fan   int width = ((const thisARG *)argp)->width;
1434a1a9510SRong-En Fan   unsigned char *bp = (unsigned char *)field_buffer(field, 0);
1444a1a9510SRong-En Fan   bool result = (width < 0);
1454a1a9510SRong-En Fan 
1464a1a9510SRong-En Fan   Check_CTYPE_Field(result, bp, width, Check_This_Character);
1474a1a9510SRong-En Fan   return (result);
1484a1a9510SRong-En Fan }
1494a1a9510SRong-En Fan 
1504a1a9510SRong-En Fan static FIELDTYPE typeTHIS =
1514a1a9510SRong-En Fan {
1520e3d5408SPeter Wemm   _HAS_ARGS | _RESIDENT,
1530e3d5408SPeter Wemm   1,				/* this is mutable, so we can't be const */
1540e3d5408SPeter Wemm   (FIELDTYPE *)0,
1550e3d5408SPeter Wemm   (FIELDTYPE *)0,
1564a1a9510SRong-En Fan   Make_This_Type,
1574a1a9510SRong-En Fan   Copy_This_Type,
1584a1a9510SRong-En Fan   Free_This_Type,
1594a1a9510SRong-En Fan   Check_This_Field,
1604a1a9510SRong-En Fan   Check_This_Character,
1610e3d5408SPeter Wemm   NULL,
1620e3d5408SPeter Wemm   NULL
1630e3d5408SPeter Wemm };
1640e3d5408SPeter Wemm 
1654a1a9510SRong-En Fan NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_ALNUM = &typeTHIS;
1660e3d5408SPeter Wemm 
1670e3d5408SPeter Wemm /* fty_alnum.c ends here */
168