xref: /freebsd/contrib/ncurses/form/fty_alnum.c (revision 4a1a95108dd76c4259fe6c37c4471f7969b17983)
14a1a9510SRong-En Fan /****************************************************************************
24a1a9510SRong-En Fan  * Copyright (c) 1998-2005,2006 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 
374a1a9510SRong-En Fan MODULE_ID("$Id: fty_alnum.c,v 1.19 2006/04/22 21:33:05 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 {
584a1a9510SRong-En Fan   thisARG *argp = (thisARG *) malloc(sizeof(thisARG));
590e3d5408SPeter Wemm 
600e3d5408SPeter Wemm   if (argp)
610e3d5408SPeter Wemm     argp->width = va_arg(*ap, int);
620e3d5408SPeter Wemm 
630e3d5408SPeter Wemm   return ((void *)argp);
640e3d5408SPeter Wemm }
650e3d5408SPeter Wemm 
660e3d5408SPeter Wemm /*---------------------------------------------------------------------------
670e3d5408SPeter Wemm |   Facility      :  libnform
684a1a9510SRong-En Fan |   Function      :  static void *Copy_ThisType(const void *argp)
690e3d5408SPeter Wemm |
700e3d5408SPeter Wemm |   Description   :  Copy structure for alphanumeric type argument.
710e3d5408SPeter Wemm |
720e3d5408SPeter Wemm |   Return Values :  Pointer to argument structure or NULL on error.
730e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
744a1a9510SRong-En Fan static void *
754a1a9510SRong-En Fan Copy_This_Type(const void *argp)
760e3d5408SPeter Wemm {
774a1a9510SRong-En Fan   const thisARG *ap = (const thisARG *)argp;
784a1a9510SRong-En Fan   thisARG *result = (thisARG *) malloc(sizeof(thisARG));
790e3d5408SPeter Wemm 
800e3d5408SPeter Wemm   if (result)
810e3d5408SPeter Wemm     *result = *ap;
820e3d5408SPeter Wemm 
830e3d5408SPeter Wemm   return ((void *)result);
840e3d5408SPeter Wemm }
850e3d5408SPeter Wemm 
860e3d5408SPeter Wemm /*---------------------------------------------------------------------------
870e3d5408SPeter Wemm |   Facility      :  libnform
884a1a9510SRong-En Fan |   Function      :  static void Free_This_Type(void *argp)
890e3d5408SPeter Wemm |
900e3d5408SPeter Wemm |   Description   :  Free structure for alphanumeric type argument.
910e3d5408SPeter Wemm |
920e3d5408SPeter Wemm |   Return Values :  -
930e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
944a1a9510SRong-En Fan static void
954a1a9510SRong-En Fan Free_This_Type(void *argp)
960e3d5408SPeter Wemm {
970e3d5408SPeter Wemm   if (argp)
980e3d5408SPeter Wemm     free(argp);
990e3d5408SPeter Wemm }
1000e3d5408SPeter Wemm 
1010e3d5408SPeter Wemm /*---------------------------------------------------------------------------
1020e3d5408SPeter Wemm |   Facility      :  libnform
1034a1a9510SRong-En Fan |   Function      :  static bool Check_This_Character(
1040e3d5408SPeter Wemm |                                      int c,
1050e3d5408SPeter Wemm |                                      const void *argp)
1060e3d5408SPeter Wemm |
1070e3d5408SPeter Wemm |   Description   :  Check a character for the alphanumeric type.
1080e3d5408SPeter Wemm |
1090e3d5408SPeter Wemm |   Return Values :  TRUE  - character is valid
1100e3d5408SPeter Wemm |                    FALSE - character is invalid
1110e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1124a1a9510SRong-En Fan static bool
1134a1a9510SRong-En Fan Check_This_Character(int c, const void *argp GCC_UNUSED)
1140e3d5408SPeter Wemm {
1154a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
1164a1a9510SRong-En Fan   if (iswalnum((wint_t) c))
1174a1a9510SRong-En Fan     return TRUE;
1184a1a9510SRong-En Fan #endif
1194a1a9510SRong-En Fan   return (isalnum(UChar(c)) ? TRUE : FALSE);
1200e3d5408SPeter Wemm }
1210e3d5408SPeter Wemm 
1224a1a9510SRong-En Fan /*---------------------------------------------------------------------------
1234a1a9510SRong-En Fan |   Facility      :  libnform
1244a1a9510SRong-En Fan |   Function      :  static bool Check_This_Field(
1254a1a9510SRong-En Fan |                                      FIELD *field,
1264a1a9510SRong-En Fan |                                      const void *argp)
1274a1a9510SRong-En Fan |
1284a1a9510SRong-En Fan |   Description   :  Validate buffer content to be a valid alphanumeric value
1294a1a9510SRong-En Fan |
1304a1a9510SRong-En Fan |   Return Values :  TRUE  - field is valid
1314a1a9510SRong-En Fan |                    FALSE - field is invalid
1324a1a9510SRong-En Fan +--------------------------------------------------------------------------*/
1334a1a9510SRong-En Fan static bool
1344a1a9510SRong-En Fan Check_This_Field(FIELD *field, const void *argp)
1354a1a9510SRong-En Fan {
1364a1a9510SRong-En Fan   int width = ((const thisARG *)argp)->width;
1374a1a9510SRong-En Fan   unsigned char *bp = (unsigned char *)field_buffer(field, 0);
1384a1a9510SRong-En Fan   bool result = (width < 0);
1394a1a9510SRong-En Fan 
1404a1a9510SRong-En Fan   Check_CTYPE_Field(result, bp, width, Check_This_Character);
1414a1a9510SRong-En Fan   return (result);
1424a1a9510SRong-En Fan }
1434a1a9510SRong-En Fan 
1444a1a9510SRong-En Fan static FIELDTYPE typeTHIS =
1454a1a9510SRong-En Fan {
1460e3d5408SPeter Wemm   _HAS_ARGS | _RESIDENT,
1470e3d5408SPeter Wemm   1,				/* this is mutable, so we can't be const */
1480e3d5408SPeter Wemm   (FIELDTYPE *)0,
1490e3d5408SPeter Wemm   (FIELDTYPE *)0,
1504a1a9510SRong-En Fan   Make_This_Type,
1514a1a9510SRong-En Fan   Copy_This_Type,
1524a1a9510SRong-En Fan   Free_This_Type,
1534a1a9510SRong-En Fan   Check_This_Field,
1544a1a9510SRong-En Fan   Check_This_Character,
1550e3d5408SPeter Wemm   NULL,
1560e3d5408SPeter Wemm   NULL
1570e3d5408SPeter Wemm };
1580e3d5408SPeter Wemm 
1594a1a9510SRong-En Fan NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_ALNUM = &typeTHIS;
1600e3d5408SPeter Wemm 
1610e3d5408SPeter Wemm /* fty_alnum.c ends here */
162