xref: /freebsd/contrib/ncurses/form/fty_alpha.c (revision 7a65641922f404b84e9a249d48593de84d8e8d17)
14a1a9510SRong-En Fan /****************************************************************************
2e1865124SBaptiste Daroussin  * Copyright 2020 Thomas E. Dickey                                          *
3e1865124SBaptiste 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*7a656419SBaptiste Daroussin MODULE_ID("$Id: fty_alpha.c,v 1.31 2020/12/12 01:15:37 tom Exp $")
390e3d5408SPeter Wemm 
404a1a9510SRong-En Fan #define thisARG alphaARG
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(va_list *ap)
5106bfebdeSXin LI |
5206bfebdeSXin LI |   Description   :  Allocate structure for alpha type argument.
5306bfebdeSXin LI |
5406bfebdeSXin LI |   Return Values :  Pointer to argument structure or NULL on error
5506bfebdeSXin LI +--------------------------------------------------------------------------*/
5606bfebdeSXin LI static void *
Generic_This_Type(void * arg)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 alpha type argument.
790e3d5408SPeter Wemm |
800e3d5408SPeter Wemm |   Return Values :  Pointer to argument structure or NULL on error
810e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
824a1a9510SRong-En Fan static void *
Make_This_Type(va_list * ap)834a1a9510SRong-En Fan Make_This_Type(va_list *ap)
840e3d5408SPeter Wemm {
8506bfebdeSXin LI   int w = va_arg(*ap, int);
864a1a9510SRong-En Fan 
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_This_Type(const void * argp)
930e3d5408SPeter Wemm |
940e3d5408SPeter Wemm |   Description   :  Copy structure for alpha type argument.
950e3d5408SPeter Wemm |
960e3d5408SPeter Wemm |   Return Values :  Pointer to argument structure or NULL on error.
970e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
984a1a9510SRong-En Fan static void *
Copy_This_Type(const void * argp)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     }
1094a1a9510SRong-En Fan 
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 alpha type argument.
1180e3d5408SPeter Wemm |
1190e3d5408SPeter Wemm |   Return Values :  -
1200e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1214a1a9510SRong-En Fan static void
Free_This_Type(void * argp)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 alpha type.
1350e3d5408SPeter Wemm |
1360e3d5408SPeter Wemm |   Return Values :  TRUE  - character is valid
1370e3d5408SPeter Wemm |                    FALSE - character is invalid
1380e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1394a1a9510SRong-En Fan static bool
Check_This_Character(int c,const void * argp GCC_UNUSED)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 (iswalpha((wint_t)c))
1444a1a9510SRong-En Fan     return TRUE;
1454a1a9510SRong-En Fan #endif
1464a1a9510SRong-En Fan   return (isalpha(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 alpha 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
Check_This_Field(FIELD * field,const void * argp)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 
189*7a656419SBaptiste Daroussin FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALPHA = &typeTHIS;
1900e3d5408SPeter Wemm 
19106bfebdeSXin LI #if NCURSES_INTEROP_FUNCS
19206bfebdeSXin LI /* The next routines are to simplify the use of ncurses from
193*7a656419SBaptiste Daroussin    programming languages with restrictions on interop with C level
19406bfebdeSXin LI    constructs (e.g. variable access or va_list + ellipsis constructs)
19506bfebdeSXin LI */
196*7a656419SBaptiste Daroussin FORM_EXPORT(FIELDTYPE *)
_nc_TYPE_ALPHA(void)19706bfebdeSXin LI _nc_TYPE_ALPHA(void)
19806bfebdeSXin LI {
19906bfebdeSXin LI   return TYPE_ALPHA;
20006bfebdeSXin LI }
20106bfebdeSXin LI #endif
20206bfebdeSXin LI 
2030e3d5408SPeter Wemm /* fty_alpha.c ends here */
204