Replace tabs in files with editor modeline "expandtab"
[metze/wireshark/wip.git] / epan / ftypes / ftype-guid.c
1 /*
2  * Wireshark - Network traffic analyzer
3  * By Gerald Combs <gerald@wireshark.org>
4  * Copyright 2001 Gerald Combs
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20
21 #include "config.h"
22
23 #include <string.h>
24 #include <stdlib.h>
25
26 #include <ftypes-int.h>
27 #include <epan/guid-utils.h>
28 #include <epan/to_str.h>
29
30 static void
31 guid_fvalue_set_guid(fvalue_t *fv, const e_guid_t *value)
32 {
33     fv->value.guid = *value;
34 }
35
36 static gpointer
37 value_get(fvalue_t *fv)
38 {
39     return &(fv->value.guid);
40 }
41
42 static gboolean
43 get_guid(const char *s, e_guid_t *guid)
44 {
45     size_t i, n;
46     const char *p;
47     char digits[9];
48     static const char fmt[] = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
49
50     n = strlen(s);
51     if (n != strlen(fmt))
52         return FALSE;
53     for (i=0; i<n; i++) {
54         if (fmt[i] == 'X') {
55             if (!g_ascii_isxdigit(s[i]))
56                 return FALSE;
57         } else {
58             if (s[i] != fmt[i])
59                 return FALSE;
60         }
61     }
62
63     p = s;
64     strncpy(digits, p, 8);
65     digits[8] = '\0';
66     guid->data1 = (guint32)strtoul(digits, NULL, 16);
67     p += 9;
68     strncpy(digits, p, 4);
69     digits[4] = '\0';
70     guid->data2 = (guint16)strtoul(digits, NULL, 16);
71     p += 5;
72     strncpy(digits, p, 4);
73     digits[4] = '\0';
74     guid->data3 = (guint16)strtoul(digits, NULL, 16);
75     p += 5;
76     for (i=0; i < sizeof(guid->data4); i++) {
77         if (*p == '-') p++;
78         digits[0] = *(p++);
79         digits[1] = *(p++);
80         digits[2] = '\0';
81         guid->data4[i] = (guint8)strtoul(digits, NULL, 16);
82     }
83     return TRUE;
84 }
85
86 static gboolean
87 guid_from_unparsed(fvalue_t *fv, const char *s, gboolean allow_partial_value _U_, gchar **err_msg)
88 {
89      e_guid_t guid;
90
91     if (!get_guid(s, &guid)) {
92         if (err_msg != NULL)
93             *err_msg = g_strdup_printf("\"%s\" is not a valid GUID.", s);
94         return FALSE;
95     }
96
97     fv->value.guid = guid;
98     return TRUE;
99 }
100
101 static int
102 guid_repr_len(fvalue_t *fv _U_, ftrepr_t rtype _U_, int field_display _U_)
103 {
104     return GUID_STR_LEN;
105 }
106
107 static void
108 guid_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, int field_display _U_, char *buf)
109 {
110     guid_to_str_buf(&fv->value.guid, buf, GUID_STR_LEN);
111 }
112
113 static gboolean
114 cmp_eq(const fvalue_t *a, const fvalue_t *b)
115 {
116     return memcmp(&a->value.guid, &b->value.guid, sizeof(e_guid_t)) == 0;
117 }
118
119 static gboolean
120 cmp_ne(const fvalue_t *a, const fvalue_t *b)
121 {
122     return memcmp(&a->value.guid, &b->value.guid, sizeof(e_guid_t)) != 0;
123 }
124
125 void
126 ftype_register_guid(void)
127 {
128
129     static ftype_t guid_type = {
130         FT_GUID,              /* ftype */
131         "FT_GUID",           /* name */
132         "Globally Unique Identifier",            /* pretty_name */
133         GUID_LEN,            /* wire_size */
134         NULL,                /* new_value */
135         NULL,                /* free_value */
136         guid_from_unparsed,  /* val_from_unparsed */
137         NULL,                /* val_from_string */
138         guid_to_repr,        /* val_to_string_repr */
139         guid_repr_len,       /* len_string_repr */
140
141         NULL,                /* set_value_byte_array */
142         NULL,                /* set_value_bytes */
143         guid_fvalue_set_guid, /* set_value_guid */
144         NULL,                /* set_value_time */
145         NULL,                /* set_value_string */
146         NULL,                /* set_value_tvbuff */
147         NULL,                /* set_value_uinteger */
148         NULL,                /* set_value_sinteger */
149         NULL,                /* set_value_uinteger64 */
150         NULL,                /* set_value_sinteger64 */
151         NULL,                /* set_value_floating */
152
153         value_get,           /* get_value */
154         NULL,                /* get_value_uinteger */
155         NULL,                /* get_value_sinteger */
156         NULL,                /* get_value_uinteger64 */
157         NULL,                /* get_value_sinteger64 */
158         NULL,                /* get_value_floating */
159
160         cmp_eq,
161         cmp_ne,
162         NULL,
163         NULL,
164         NULL,
165         NULL,
166         NULL,
167         NULL,
168         NULL,                /* cmp_matches */
169
170         NULL,
171         NULL,
172     };
173
174     ftype_register(FT_GUID, &guid_type);
175 }
176
177 /*
178  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
179  *
180  * Local variables:
181  * c-basic-offset: 4
182  * tab-width: 8
183  * indent-tabs-mode: nil
184  * End:
185  *
186  * vi: set shiftwidth=4 tabstop=8 expandtab:
187  * :indentSize=4:tabSize=8:noTabs=true:
188  */