1 2 /* 3 * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT. 4 * You may freely copy it for use as a template for your own field types. 5 * If you develop a field type that might be of general use, please send 6 * it back to the ncurses maintainers for inclusion in the next version. 7 */ 8 /*************************************************************************** 9 * * 10 * Author : Juergen Pfeifer, juergen.pfeifer@gmx.net * 11 * * 12 ***************************************************************************/ 13 14 #include "form.priv.h" 15 16 MODULE_ID("$Id: fty_int.c,v 1.10 1999/05/16 17:23:22 juergen Exp $") 17 18 typedef struct { 19 int precision; 20 long low; 21 long high; 22 } integerARG; 23 24 /*--------------------------------------------------------------------------- 25 | Facility : libnform 26 | Function : static void *Make_Integer_Type( va_list * ap ) 27 | 28 | Description : Allocate structure for integer type argument. 29 | 30 | Return Values : Pointer to argument structure or NULL on error 31 +--------------------------------------------------------------------------*/ 32 static void *Make_Integer_Type(va_list * ap) 33 { 34 integerARG *argp = (integerARG *)malloc(sizeof(integerARG)); 35 36 if (argp) 37 { 38 argp->precision = va_arg(*ap,int); 39 argp->low = va_arg(*ap,long); 40 argp->high = va_arg(*ap,long); 41 } 42 return (void *)argp; 43 } 44 45 /*--------------------------------------------------------------------------- 46 | Facility : libnform 47 | Function : static void *Copy_Integer_Type(const void * argp) 48 | 49 | Description : Copy structure for integer type argument. 50 | 51 | Return Values : Pointer to argument structure or NULL on error. 52 +--------------------------------------------------------------------------*/ 53 static void *Copy_Integer_Type(const void * argp) 54 { 55 const integerARG *ap = (const integerARG *)argp; 56 integerARG *result = (integerARG *)0; 57 58 if (argp) 59 { 60 result = (integerARG *)malloc(sizeof(integerARG)); 61 if (result) 62 *result = *ap; 63 } 64 return (void *)result; 65 } 66 67 /*--------------------------------------------------------------------------- 68 | Facility : libnform 69 | Function : static void Free_Integer_Type(void * argp) 70 | 71 | Description : Free structure for integer type argument. 72 | 73 | Return Values : - 74 +--------------------------------------------------------------------------*/ 75 static void Free_Integer_Type(void * argp) 76 { 77 if (argp) 78 free(argp); 79 } 80 81 /*--------------------------------------------------------------------------- 82 | Facility : libnform 83 | Function : static bool Check_Integer_Field( 84 | FIELD * field, 85 | const void * argp) 86 | 87 | Description : Validate buffer content to be a valid integer value 88 | 89 | Return Values : TRUE - field is valid 90 | FALSE - field is invalid 91 +--------------------------------------------------------------------------*/ 92 static bool Check_Integer_Field(FIELD * field, const void * argp) 93 { 94 const integerARG *argi = (const integerARG *)argp; 95 long low = argi->low; 96 long high = argi->high; 97 int prec = argi->precision; 98 unsigned char *bp = (unsigned char *)field_buffer(field,0); 99 char *s = (char *)bp; 100 long val; 101 char buf[100]; 102 103 while( *bp && *bp==' ') bp++; 104 if (*bp) 105 { 106 if (*bp=='-') bp++; 107 while (*bp) 108 { 109 if (!isdigit(*bp)) break; 110 bp++; 111 } 112 while(*bp && *bp==' ') bp++; 113 if (*bp=='\0') 114 { 115 val = atol(s); 116 if (low<high) 117 { 118 if (val<low || val>high) return FALSE; 119 } 120 sprintf(buf,"%.*ld",(prec>0?prec:0),val); 121 set_field_buffer(field,0,buf); 122 return TRUE; 123 } 124 } 125 return FALSE; 126 } 127 128 /*--------------------------------------------------------------------------- 129 | Facility : libnform 130 | Function : static bool Check_Integer_Character( 131 | int c, 132 | const void * argp) 133 | 134 | Description : Check a character for the integer type. 135 | 136 | Return Values : TRUE - character is valid 137 | FALSE - character is invalid 138 +--------------------------------------------------------------------------*/ 139 static bool Check_Integer_Character(int c, const void * argp GCC_UNUSED) 140 { 141 return ((isdigit(c) || (c=='-')) ? TRUE : FALSE); 142 } 143 144 static FIELDTYPE typeINTEGER = { 145 _HAS_ARGS | _RESIDENT, 146 1, /* this is mutable, so we can't be const */ 147 (FIELDTYPE *)0, 148 (FIELDTYPE *)0, 149 Make_Integer_Type, 150 Copy_Integer_Type, 151 Free_Integer_Type, 152 Check_Integer_Field, 153 Check_Integer_Character, 154 NULL, 155 NULL 156 }; 157 158 FIELDTYPE* TYPE_INTEGER = &typeINTEGER; 159 160 /* fty_int.c ends here */ 161