ncurses 6.2 - patch 20210501
[ncurses.git] / form / fty_alnum.c
1 /****************************************************************************
2  * Copyright 2020 Thomas E. Dickey                                          *
3  * Copyright 1998-2009,2010 Free Software Foundation, Inc.                  *
4  *                                                                          *
5  * Permission is hereby granted, free of charge, to any person obtaining a  *
6  * copy of this software and associated documentation files (the            *
7  * "Software"), to deal in the Software without restriction, including      *
8  * without limitation the rights to use, copy, modify, merge, publish,      *
9  * distribute, distribute with modifications, sublicense, and/or sell       *
10  * copies of the Software, and to permit persons to whom the Software is    *
11  * furnished to do so, subject to the following conditions:                 *
12  *                                                                          *
13  * The above copyright notice and this permission notice shall be included  *
14  * in all copies or substantial portions of the Software.                   *
15  *                                                                          *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
19  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
22  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
23  *                                                                          *
24  * Except as contained in this notice, the name(s) of the above copyright   *
25  * holders shall not be used in advertising or otherwise to promote the     *
26  * sale, use or other dealings in this Software without prior written       *
27  * authorization.                                                           *
28  ****************************************************************************/
29
30 /***************************************************************************
31 *                                                                          *
32 *  Author : Juergen Pfeifer                                                *
33 *                                                                          *
34 ***************************************************************************/
35
36 #include "form.priv.h"
37
38 MODULE_ID("$Id: fty_alnum.c,v 1.29 2020/12/12 01:15:37 tom Exp $")
39
40 #define thisARG alnumARG
41
42 typedef struct
43   {
44     int width;
45   }
46 thisARG;
47
48 /*---------------------------------------------------------------------------
49 |   Facility      :  libnform
50 |   Function      :  static void *Generic_This_Type(void *arg)
51 |
52 |   Description   :  Allocate structure for alphanumeric type argument.
53 |
54 |   Return Values :  Pointer to argument structure or NULL on error
55 +--------------------------------------------------------------------------*/
56 static void *
57 Generic_This_Type(void *arg)
58 {
59   thisARG *argp = (thisARG *)0;
60
61   if (arg)
62     {
63       argp = typeMalloc(thisARG, 1);
64
65       if (argp)
66         {
67           T((T_CREATE("thisARG %p"), (void *)argp));
68           argp->width = *((int *)arg);
69         }
70     }
71   return ((void *)argp);
72 }
73
74 /*---------------------------------------------------------------------------
75 |   Facility      :  libnform
76 |   Function      :  static void *Make_This_Type(va_list *ap)
77 |
78 |   Description   :  Allocate structure for alphanumeric type argument.
79 |
80 |   Return Values :  Pointer to argument structure or NULL on error
81 +--------------------------------------------------------------------------*/
82 static void *
83 Make_This_Type(va_list *ap)
84 {
85   int w = va_arg(*ap, int);
86
87   return Generic_This_Type((void *)&w);
88 }
89
90 /*---------------------------------------------------------------------------
91 |   Facility      :  libnform
92 |   Function      :  static void *Copy_ThisType(const void *argp)
93 |
94 |   Description   :  Copy structure for alphanumeric type argument.
95 |
96 |   Return Values :  Pointer to argument structure or NULL on error.
97 +--------------------------------------------------------------------------*/
98 static void *
99 Copy_This_Type(const void *argp)
100 {
101   const thisARG *ap = (const thisARG *)argp;
102   thisARG *result = typeMalloc(thisARG, 1);
103
104   if (result)
105     {
106       T((T_CREATE("thisARG %p"), (void *)result));
107       *result = *ap;
108     }
109
110   return ((void *)result);
111 }
112
113 /*---------------------------------------------------------------------------
114 |   Facility      :  libnform
115 |   Function      :  static void Free_This_Type(void *argp)
116 |
117 |   Description   :  Free structure for alphanumeric type argument.
118 |
119 |   Return Values :  -
120 +--------------------------------------------------------------------------*/
121 static void
122 Free_This_Type(void *argp)
123 {
124   if (argp)
125     free(argp);
126 }
127
128 /*---------------------------------------------------------------------------
129 |   Facility      :  libnform
130 |   Function      :  static bool Check_This_Character(
131 |                                      int c,
132 |                                      const void *argp)
133 |
134 |   Description   :  Check a character for the alphanumeric type.
135 |
136 |   Return Values :  TRUE  - character is valid
137 |                    FALSE - character is invalid
138 +--------------------------------------------------------------------------*/
139 static bool
140 Check_This_Character(int c, const void *argp GCC_UNUSED)
141 {
142 #if USE_WIDEC_SUPPORT
143   if (iswalnum((wint_t)c))
144     return TRUE;
145 #endif
146   return (isalnum(UChar(c)) ? TRUE : FALSE);
147 }
148
149 /*---------------------------------------------------------------------------
150 |   Facility      :  libnform
151 |   Function      :  static bool Check_This_Field(
152 |                                      FIELD *field,
153 |                                      const void *argp)
154 |
155 |   Description   :  Validate buffer content to be a valid alphanumeric value
156 |
157 |   Return Values :  TRUE  - field is valid
158 |                    FALSE - field is invalid
159 +--------------------------------------------------------------------------*/
160 static bool
161 Check_This_Field(FIELD *field, const void *argp)
162 {
163   int width = ((const thisARG *)argp)->width;
164   unsigned char *bp = (unsigned char *)field_buffer(field, 0);
165   bool result = (width < 0);
166
167   Check_CTYPE_Field(result, bp, width, Check_This_Character);
168   return (result);
169 }
170
171 static FIELDTYPE typeTHIS =
172 {
173   _HAS_ARGS | _RESIDENT,
174   1,                            /* this is mutable, so we can't be const */
175   (FIELDTYPE *)0,
176   (FIELDTYPE *)0,
177   Make_This_Type,
178   Copy_This_Type,
179   Free_This_Type,
180   INIT_FT_FUNC(Check_This_Field),
181   INIT_FT_FUNC(Check_This_Character),
182   INIT_FT_FUNC(NULL),
183   INIT_FT_FUNC(NULL),
184 #if NCURSES_INTEROP_FUNCS
185   Generic_This_Type
186 #endif
187 };
188
189 FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALNUM = &typeTHIS;
190
191 #if NCURSES_INTEROP_FUNCS
192 /* The next routines are to simplify the use of ncurses from
193    programming languages with restrictions on interop with C level
194    constructs (e.g. variable access or va_list + ellipsis constructs)
195 */
196 FORM_EXPORT(FIELDTYPE *)
197 _nc_TYPE_ALNUM(void)
198 {
199   return TYPE_ALNUM;
200 }
201 #endif
202
203 /* fty_alnum.c ends here */