The Assimilation Project
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
tlvhelper.c
Go to the documentation of this file.
1 
25 #include <string.h>
26 #include <glib.h>
27 #include <tlvhelper.h>
29 guint8
30 tlv_get_guint8(const void * vitem,
31  const void* bufend)
32 {
33  const guint8* itemptr = (const guint8*)vitem;
34  guint8 item;
35  g_return_val_if_fail(vitem != NULL && vitem < bufend, (guint8)0xff);
36  item = *itemptr;
37  return item;
38 }
40 void
41 tlv_set_guint8(void * vitem,
42  guint8 item,
43  const void* bufend)
44 {
45  guint8* itemptr = (guint8*)vitem;
46  g_return_if_fail(vitem < bufend);
47  *itemptr = item;
48 }
49 
52 guint16
53 tlv_get_guint16(const void * vitem,
54  const void* bufend)
55 {
56  const guint16* itemptr = (const guint16*)vitem;
57  guint16 item;
58  if (!(vitem != NULL && ((itemptr+1) <= (const guint16*)bufend))) {
59  g_error("UhOh! vitem is %p and bufend is %p", vitem, bufend);
60  }
61  g_return_val_if_fail(vitem != NULL && ((const void*)(itemptr+1) <= bufend), (guint16)0xffff);
62  memcpy(&item, vitem, sizeof(item));
63  return g_ntohs(item);
64 }
67 void
68 tlv_set_guint16(void * vitem,
69  guint16 item,
70  const void* bufend)
71 {
72  guint16* itemptr = (guint16*)vitem;
73  g_return_if_fail(vitem != NULL && ((void*)(itemptr+1)) <= bufend);
74  item = g_htons(item);
75  memcpy(vitem, &item, sizeof(item));
76 }
77 
80 guint32
81 tlv_get_guint32(const void * vitem,
82  const void* bufend)
83 {
84  const guint32* itemptr = (const guint32*)vitem;
85  guint32 item;
86  g_return_val_if_fail(vitem != NULL && ((const void*)(itemptr+1) <= bufend), (guint32)0xffffffff);
87  memcpy(&item, vitem, sizeof(item));
88  return g_ntohl(item);
89 }
92 void
93 tlv_set_guint32(void * vitem,
94  guint32 item,
95  const void* bufend)
96 {
97  guint32* itemptr = (guint32*)vitem;
98  g_return_if_fail(vitem != NULL && ((void*)(itemptr+1) <= bufend));
99  item = g_htonl(item);
100  memcpy(vitem, &item, sizeof(item));
101 }
102 
103 
106 guint64
107 tlv_get_guint64(const void * vitem,
108  const void* bufend)
109 {
110  const guint64* itemptr = (const guint64*)vitem;
111  guint64 item;
112  g_return_val_if_fail(vitem != NULL && ((const void*)(itemptr+1) <= bufend), (guint32)0xffffffff);
113  memcpy(&item, vitem, sizeof(item));
114  return GINT64_FROM_BE(item);
115 }
118 void
119 tlv_set_guint64(void * vitem,
120  guint64 item,
121  const void* bufend)
122 {
123  guint64* itemptr = (guint64*)vitem;
124  g_return_if_fail(vitem != NULL && ((void*)(itemptr+1) <= bufend));
125  item = GINT64_TO_BE(item);
126  memcpy(vitem, &item, sizeof(item));
127 }
130 guint32
131 tlv_get_guint24(const void * vitem,
132  const void* bufend)
133 {
134  guint32 item;
135  guint8 firstbyte;
136  g_return_val_if_fail(vitem != NULL && ((const void*)((const guint8*)vitem+3)) <= bufend, (guint32)0xffffff);
137  firstbyte = *((const guint8*)vitem);
139  item = tlv_get_guint16((((const guint8 *)vitem+1)), bufend);
140  item += ((((guint32)firstbyte)<<16)&0xff0000);
141  return item;
142 }
145 void
146 tlv_set_guint24(void * vitem,
147  guint32 item,
148  const void* bufend)
149 {
150  guint8 firstbyte = ((item>>16)&0xff);
151  guint16 item16;
152  g_return_if_fail(vitem != NULL && (void*)(((guint8*)vitem)+3) <= bufend);
153  item16 = (guint16) (item & 0xffff);
155  *((guint8 *)vitem) = firstbyte;
156  tlv_set_guint16(((guint8 *)vitem+1), item16, bufend);
157 }