xref: /freebsd/contrib/ncurses/form/fty_alnum.c (revision 0e3d540892016a47f6a68ec9ba2879d35ce5f7c2)
10e3d5408SPeter Wemm 
20e3d5408SPeter Wemm /*
30e3d5408SPeter Wemm  * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
40e3d5408SPeter Wemm  * You may freely copy it for use as a template for your own field types.
50e3d5408SPeter Wemm  * If you develop a field type that might be of general use, please send
60e3d5408SPeter Wemm  * it back to the ncurses maintainers for inclusion in the next version.
70e3d5408SPeter Wemm  */
80e3d5408SPeter Wemm /***************************************************************************
90e3d5408SPeter Wemm *                                                                          *
100e3d5408SPeter Wemm *  Author : Juergen Pfeifer, juergen.pfeifer@gmx.net                       *
110e3d5408SPeter Wemm *                                                                          *
120e3d5408SPeter Wemm ***************************************************************************/
130e3d5408SPeter Wemm 
140e3d5408SPeter Wemm #include "form.priv.h"
150e3d5408SPeter Wemm 
160e3d5408SPeter Wemm MODULE_ID("$Id: fty_alnum.c,v 1.9 1999/05/16 17:22:49 juergen Exp $")
170e3d5408SPeter Wemm 
180e3d5408SPeter Wemm typedef struct {
190e3d5408SPeter Wemm   int width;
200e3d5408SPeter Wemm } alnumARG;
210e3d5408SPeter Wemm 
220e3d5408SPeter Wemm /*---------------------------------------------------------------------------
230e3d5408SPeter Wemm |   Facility      :  libnform
240e3d5408SPeter Wemm |   Function      :  static void *Make_AlphaNumeric_Type(va_list *ap)
250e3d5408SPeter Wemm |
260e3d5408SPeter Wemm |   Description   :  Allocate structure for alphanumeric type argument.
270e3d5408SPeter Wemm |
280e3d5408SPeter Wemm |   Return Values :  Pointer to argument structure or NULL on error
290e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
300e3d5408SPeter Wemm static void *Make_AlphaNumeric_Type(va_list * ap)
310e3d5408SPeter Wemm {
320e3d5408SPeter Wemm   alnumARG *argp = (alnumARG *)malloc(sizeof(alnumARG));
330e3d5408SPeter Wemm 
340e3d5408SPeter Wemm   if (argp)
350e3d5408SPeter Wemm     argp->width = va_arg(*ap,int);
360e3d5408SPeter Wemm 
370e3d5408SPeter Wemm   return ((void *)argp);
380e3d5408SPeter Wemm }
390e3d5408SPeter Wemm 
400e3d5408SPeter Wemm /*---------------------------------------------------------------------------
410e3d5408SPeter Wemm |   Facility      :  libnform
420e3d5408SPeter Wemm |   Function      :  static void *Copy_AlphaNumericType(const void *argp)
430e3d5408SPeter Wemm |
440e3d5408SPeter Wemm |   Description   :  Copy structure for alphanumeric type argument.
450e3d5408SPeter Wemm |
460e3d5408SPeter Wemm |   Return Values :  Pointer to argument structure or NULL on error.
470e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
480e3d5408SPeter Wemm static void *Copy_AlphaNumeric_Type(const void *argp)
490e3d5408SPeter Wemm {
500e3d5408SPeter Wemm   const alnumARG *ap = (const alnumARG *)argp;
510e3d5408SPeter Wemm   alnumARG *result = (alnumARG *)malloc(sizeof(alnumARG));
520e3d5408SPeter Wemm 
530e3d5408SPeter Wemm   if (result)
540e3d5408SPeter Wemm     *result = *ap;
550e3d5408SPeter Wemm 
560e3d5408SPeter Wemm   return ((void *)result);
570e3d5408SPeter Wemm }
580e3d5408SPeter Wemm 
590e3d5408SPeter Wemm /*---------------------------------------------------------------------------
600e3d5408SPeter Wemm |   Facility      :  libnform
610e3d5408SPeter Wemm |   Function      :  static void Free_AlphaNumeric_Type(void *argp)
620e3d5408SPeter Wemm |
630e3d5408SPeter Wemm |   Description   :  Free structure for alphanumeric type argument.
640e3d5408SPeter Wemm |
650e3d5408SPeter Wemm |   Return Values :  -
660e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
670e3d5408SPeter Wemm static void Free_AlphaNumeric_Type(void * argp)
680e3d5408SPeter Wemm {
690e3d5408SPeter Wemm   if (argp)
700e3d5408SPeter Wemm     free(argp);
710e3d5408SPeter Wemm }
720e3d5408SPeter Wemm 
730e3d5408SPeter Wemm /*---------------------------------------------------------------------------
740e3d5408SPeter Wemm |   Facility      :  libnform
750e3d5408SPeter Wemm |   Function      :  static bool Check_AlphaNumeric_Field(
760e3d5408SPeter Wemm |                                      FIELD *field,
770e3d5408SPeter Wemm |                                      const void *argp)
780e3d5408SPeter Wemm |
790e3d5408SPeter Wemm |   Description   :  Validate buffer content to be a valid alphanumeric value
800e3d5408SPeter Wemm |
810e3d5408SPeter Wemm |   Return Values :  TRUE  - field is valid
820e3d5408SPeter Wemm |                    FALSE - field is invalid
830e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
840e3d5408SPeter Wemm static bool Check_AlphaNumeric_Field(FIELD * field, const void * argp)
850e3d5408SPeter Wemm {
860e3d5408SPeter Wemm   int width = ((const alnumARG *)argp)->width;
870e3d5408SPeter Wemm   unsigned char *bp  = (unsigned char *)field_buffer(field,0);
880e3d5408SPeter Wemm   int  l = -1;
890e3d5408SPeter Wemm   unsigned char *s;
900e3d5408SPeter Wemm 
910e3d5408SPeter Wemm   while(*bp && *bp==' ')
920e3d5408SPeter Wemm     bp++;
930e3d5408SPeter Wemm   if (*bp)
940e3d5408SPeter Wemm     {
950e3d5408SPeter Wemm       s = bp;
960e3d5408SPeter Wemm       while(*bp && isalnum(*bp))
970e3d5408SPeter Wemm 	bp++;
980e3d5408SPeter Wemm       l = (int)(bp-s);
990e3d5408SPeter Wemm       while(*bp && *bp==' ')
1000e3d5408SPeter Wemm 	bp++;
1010e3d5408SPeter Wemm     }
1020e3d5408SPeter Wemm   return ((*bp || (l < width)) ? FALSE : TRUE);
1030e3d5408SPeter Wemm }
1040e3d5408SPeter Wemm 
1050e3d5408SPeter Wemm /*---------------------------------------------------------------------------
1060e3d5408SPeter Wemm |   Facility      :  libnform
1070e3d5408SPeter Wemm |   Function      :  static bool Check_AlphaNumeric_Character(
1080e3d5408SPeter Wemm |                                      int c,
1090e3d5408SPeter Wemm |                                      const void *argp )
1100e3d5408SPeter Wemm |
1110e3d5408SPeter Wemm |   Description   :  Check a character for the alphanumeric type.
1120e3d5408SPeter Wemm |
1130e3d5408SPeter Wemm |   Return Values :  TRUE  - character is valid
1140e3d5408SPeter Wemm |                    FALSE - character is invalid
1150e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1160e3d5408SPeter Wemm static bool Check_AlphaNumeric_Character(int c, const void * argp GCC_UNUSED)
1170e3d5408SPeter Wemm {
1180e3d5408SPeter Wemm   return (isalnum(c) ? TRUE : FALSE);
1190e3d5408SPeter Wemm }
1200e3d5408SPeter Wemm 
1210e3d5408SPeter Wemm static FIELDTYPE typeALNUM = {
1220e3d5408SPeter Wemm   _HAS_ARGS | _RESIDENT,
1230e3d5408SPeter Wemm   1,                           /* this is mutable, so we can't be const */
1240e3d5408SPeter Wemm   (FIELDTYPE *)0,
1250e3d5408SPeter Wemm   (FIELDTYPE *)0,
1260e3d5408SPeter Wemm   Make_AlphaNumeric_Type,
1270e3d5408SPeter Wemm   Copy_AlphaNumeric_Type,
1280e3d5408SPeter Wemm   Free_AlphaNumeric_Type,
1290e3d5408SPeter Wemm   Check_AlphaNumeric_Field,
1300e3d5408SPeter Wemm   Check_AlphaNumeric_Character,
1310e3d5408SPeter Wemm   NULL,
1320e3d5408SPeter Wemm   NULL
1330e3d5408SPeter Wemm };
1340e3d5408SPeter Wemm 
1350e3d5408SPeter Wemm FIELDTYPE* TYPE_ALNUM = &typeALNUM;
1360e3d5408SPeter Wemm 
1370e3d5408SPeter Wemm /* fty_alnum.c ends here */
138