ncurses 5.0
[ncurses.git] / form / fty_ipv4.c
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 : Per Foreby, perf@efd.lth.se                                    *
11 *                                                                          *
12 ***************************************************************************/
13
14 #include "form.priv.h"
15
16 MODULE_ID("$Id: fty_ipv4.c,v 1.2 1997/04/26 22:06:00 tom Exp $")
17
18 /*---------------------------------------------------------------------------
19 |   Facility      :  libnform  
20 |   Function      :  static bool Check_IPV4_Field(
21 |                                      FIELD * field,
22 |                                      const void * argp)
23 |   
24 |   Description   :  Validate buffer content to be a valid IP number (Ver. 4)
25 |
26 |   Return Values :  TRUE  - field is valid
27 |                    FALSE - field is invalid
28 +--------------------------------------------------------------------------*/
29 static bool Check_IPV4_Field(FIELD * field, const void * argp GCC_UNUSED)
30 {
31   char *bp = field_buffer(field,0);
32   int num = 0, len;
33   unsigned int d1, d2, d3, d4;
34
35   if(isdigit(*bp))              /* Must start with digit */
36     {
37       num = sscanf(bp, "%u.%u.%u.%u%n", &d1, &d2, &d3, &d4, &len);
38       if (num == 4)
39         {
40           bp += len;            /* Make bp point to what sscanf() left */
41           while (*bp && isspace(*bp))
42             bp++;               /* Allow trailing whitespace */
43         }
44     }
45   return ((num != 4 || *bp || d1 > 255 || d2 > 255
46                            || d3 > 255 || d4 > 255) ? FALSE : TRUE);
47 }
48
49 /*---------------------------------------------------------------------------
50 |   Facility      :  libnform  
51 |   Function      :  static bool Check_IPV4_Character(
52 |                                      int c, 
53 |                                      const void *argp )
54 |   
55 |   Description   :  Check a character for unsigned type or period.
56 |
57 |   Return Values :  TRUE  - character is valid
58 |                    FALSE - character is invalid
59 +--------------------------------------------------------------------------*/
60 static bool Check_IPV4_Character(int c, const void * argp GCC_UNUSED)
61 {
62   return ((isdigit(c) || (c=='.')) ? TRUE : FALSE);
63 }
64
65 static FIELDTYPE typeIPV4 = {
66   _RESIDENT,
67   1,                           /* this is mutable, so we can't be const */
68   (FIELDTYPE *)0,
69   (FIELDTYPE *)0,
70   NULL,
71   NULL,
72   NULL,
73   Check_IPV4_Field,
74   Check_IPV4_Character,
75   NULL,
76   NULL
77 };
78
79 FIELDTYPE* TYPE_IPV4 = &typeIPV4;
80
81 /* fty_ipv4.c ends here */