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