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
16MODULE_ID("$Id: fty_ipv4.c,v 1.6 2004/05/29 19:13:48 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+--------------------------------------------------------------------------*/
29static bool
30Check_IPV4_Field(FIELD *field, const void *argp GCC_UNUSED)
31{
32  char *bp = field_buffer(field, 0);
33  int num = 0, len;
34  unsigned int d1, d2, d3, d4;
35
36  if (isdigit(UChar(*bp)))	/* Must start with digit */
37    {
38      num = sscanf(bp, "%u.%u.%u.%u%n", &d1, &d2, &d3, &d4, &len);
39      if (num == 4)
40	{
41	  bp += len;		/* Make bp point to what sscanf() left */
42	  while (*bp && isspace(UChar(*bp)))
43	    bp++;		/* Allow trailing whitespace */
44	}
45    }
46  return ((num != 4 || *bp || d1 > 255 || d2 > 255
47	   || d3 > 255 || d4 > 255) ? FALSE : TRUE);
48}
49
50/*---------------------------------------------------------------------------
51|   Facility      :  libnform
52|   Function      :  static bool Check_IPV4_Character(
53|                                      int c,
54|                                      const void *argp )
55|
56|   Description   :  Check a character for unsigned type or period.
57|
58|   Return Values :  TRUE  - character is valid
59|                    FALSE - character is invalid
60+--------------------------------------------------------------------------*/
61static bool
62Check_IPV4_Character(int c, const void *argp GCC_UNUSED)
63{
64  return ((isdigit(UChar(c)) || (c == '.')) ? TRUE : FALSE);
65}
66
67static FIELDTYPE typeIPV4 =
68{
69  _RESIDENT,
70  1,				/* this is mutable, so we can't be const */
71  (FIELDTYPE *)0,
72  (FIELDTYPE *)0,
73  NULL,
74  NULL,
75  NULL,
76  Check_IPV4_Field,
77  Check_IPV4_Character,
78  NULL,
79  NULL
80};
81
82NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_IPV4 = &typeIPV4;
83
84/* fty_ipv4.c ends here */
85