ndn-lite
decoder.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018 Zhiyi Zhang, Tianyuan Yu
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v3.0. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
9 #ifndef NDN_ENCODING_DECODER_H
10 #define NDN_ENCODING_DECODER_H
11 
12 #include "encoder.h"
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
21 typedef struct ndn_decoder {
25  const uint8_t* input_value;
29  uint32_t input_size;
33  uint32_t offset;
35 
42 static inline void
43 decoder_init(ndn_decoder_t* decoder, const uint8_t* block_value, uint32_t block_size)
44 {
45  decoder->input_value = block_value;
46  decoder->input_size = block_size;
47  decoder->offset = 0;
48 }
49 
56 static inline int
57 decoder_get_var(ndn_decoder_t* decoder, uint32_t* var)
58 {
59  uint8_t first_bit = decoder->input_value[decoder->offset];
60  uint32_t rest_size = decoder->input_size - decoder->offset;
61  if (first_bit < 253) {
62  *var = first_bit;
63  decoder->offset += 1;
64  }
65  else if (first_bit == 253 && rest_size >= 3) {
66  *var = ((uint32_t)decoder->input_value[decoder->offset + 1] << 8)
67  + decoder->input_value[decoder->offset + 2];
68  decoder->offset += 3;
69  }
70  else if (first_bit == 254 && rest_size >= 5) {
71  *var = ((uint32_t)decoder->input_value[decoder->offset + 1] << 24)
72  + ((uint32_t)decoder->input_value[decoder->offset + 2] << 16)
73  + ((uint32_t)decoder->input_value[decoder->offset + 3] << 8)
74  + decoder->input_value[decoder->offset + 4];
75  decoder->offset += 5;
76  }
77  else {
78  return NDN_OVERSIZE_VAR;
79  }
80  return 0;
81 }
82 
89 static inline int
90 decoder_get_type(ndn_decoder_t* decoder, uint32_t* type)
91 {
92  return decoder_get_var(decoder, type);
93 }
94 
102 static inline int
103 decoder_get_length(ndn_decoder_t* decoder, uint32_t* length)
104 {
105  return decoder_get_var(decoder, length);
106 }
107 
117 static inline int
118 decoder_get_raw_buffer_value(ndn_decoder_t* decoder, uint8_t* value, uint32_t size)
119 {
120  int rest_length = decoder->input_size - decoder->offset;
121  if (rest_length < (int) size) {
122  return NDN_OVERSIZE;
123  }
124  memcpy(value, decoder->input_value + decoder->offset, size);
125  decoder->offset += size;
126  return 0;
127 }
128 
136 static inline int
137 decoder_get_byte_value(ndn_decoder_t* decoder, uint8_t* value)
138 {
139  if (decoder->offset + 1 > decoder->input_size)
140  return NDN_OVERSIZE;
141  *value = decoder->input_value[decoder->offset];
142  decoder->offset += 1;
143  return 0;
144 }
145 
153 static inline int
154 decoder_get_uint16_value(ndn_decoder_t* decoder, uint16_t* value)
155 {
156  if (decoder->offset + 2 > decoder->input_size)
157  return NDN_OVERSIZE;
158 
159  *value = ((uint16_t)decoder->input_value[decoder->offset] << 8)
160  + decoder->input_value[decoder->offset + 1];
161  decoder->offset += 2;
162  return 0;
163 }
164 
172 static inline int
173 decoder_get_uint32_value(ndn_decoder_t* decoder, uint32_t* value)
174 {
175  if (decoder->offset + 4 > decoder->input_size)
176  return NDN_OVERSIZE;
177  *value = 0;
178  for (int i = 0; i < 4; i++) {
179  *value += (uint32_t)decoder->input_value[decoder->offset + i] << (8 * (3 - i));
180  }
181  decoder->offset += 4;
182  return 0;
183 }
184 
192 static inline int
193 decoder_get_uint64_value(ndn_decoder_t* decoder, uint64_t* value)
194 {
195  if (decoder->offset + 8 > decoder->input_size)
196  return NDN_OVERSIZE;
197  *value = 0;
198  for (int i = 0; i < 8; i++) {
199  *value += (uint64_t)decoder->input_value[decoder->offset + i] << (8 * (7 - i));
200  }
201  decoder->offset += 8;
202  return 0;
203 }
204 
215 static inline int
216 decoder_get_uint_value(ndn_decoder_t* decoder, uint32_t length, uint64_t* value)
217 {
218  if (length == 1) {
219  uint8_t temp_value = 0;
220  decoder_get_byte_value(decoder, &temp_value);
221  *value = (uint64_t)temp_value;
222  }
223  else if (length == 2) {
224  uint16_t temp_value = 0;
225  decoder_get_uint16_value(decoder, &temp_value);
226  *value = (uint64_t)temp_value;
227  }
228  else if (length == 4) {
229  uint32_t temp_value = 0;
230  decoder_get_uint32_value(decoder, &temp_value);
231  *value = (uint64_t)temp_value;
232  }
233  else if (length == 8) {
234  decoder_get_uint64_value(decoder, value);
235  }
236  else {
237  return NDN_WRONG_TLV_LENGTH;
238  }
239  return 0;
240 }
241 
248 static inline int
249 decoder_move_forward(ndn_decoder_t* decoder, uint32_t step)
250 {
251  if (decoder->offset + step > decoder->input_size)
252  return NDN_OVERSIZE;
253  decoder->offset += step;
254  return 0;
255 }
256 
263 static inline int
264 decoder_move_backward(ndn_decoder_t* decoder, uint32_t step)
265 {
266  int new_position = decoder->offset - step;
267  if (new_position < 0)
268  return NDN_OVERSIZE;
269  decoder->offset -= step;
270  return 0;
271 }
272 
278 static inline uint32_t
280 {
281  return decoder->offset;
282 }
283 
284 #ifdef __cplusplus
285 }
286 #endif
287 #endif // NDN_ENCODING_DECODER_H
const uint8_t * input_value
The encoded wire format buffer.
Definition: decoder.h:25
uint32_t offset
The current offset after which the wire has not been decoded.
Definition: decoder.h:33
uint32_t input_size
The size of the encoded wire format buffer.
Definition: decoder.h:29
The structure to keep the state when doing NDN TLV decoding.
Definition: decoder.h:21
#define NDN_OVERSIZE_VAR
Truncation due to insufficient buffer.
Definition: ndn-error-code.h:62
#define NDN_WRONG_TLV_LENGTH
The Length specified differs from expected.
Definition: ndn-error-code.h:53
static int decoder_get_uint64_value(ndn_decoder_t *decoder, uint64_t *value)
Get the fixed size Value (V) to a uint64_t.
Definition: decoder.h:193
static int decoder_move_forward(ndn_decoder_t *decoder, uint32_t step)
Move the decoder's offset forward by.
Definition: decoder.h:249
static uint32_t decoder_get_offset(const ndn_decoder_t *decoder)
Get the offset of the decoder.
Definition: decoder.h:279
struct ndn_decoder ndn_decoder_t
The structure to keep the state when doing NDN TLV decoding.
static int decoder_get_byte_value(ndn_decoder_t *decoder, uint8_t *value)
Get the fixed size Value (V) to a single byte.
Definition: decoder.h:137
static int decoder_get_var(ndn_decoder_t *decoder, uint32_t *var)
Get the variable size Type (T) and Length (L).
Definition: decoder.h:57
static void decoder_init(ndn_decoder_t *decoder, const uint8_t *block_value, uint32_t block_size)
Init a decoder by setting the wire format buffer and its size.
Definition: decoder.h:43
static int decoder_get_uint16_value(ndn_decoder_t *decoder, uint16_t *value)
Get the fixed size Value (V) to a uint16_t.
Definition: decoder.h:154
static int decoder_move_backward(ndn_decoder_t *decoder, uint32_t step)
Move the decoder's offset backward by.
Definition: decoder.h:264
static int decoder_get_raw_buffer_value(ndn_decoder_t *decoder, uint8_t *value, uint32_t size)
Get the variable size Value (V) to bytes.
Definition: decoder.h:118
#define NDN_OVERSIZE
The object given is larger than expected.
Definition: ndn-error-code.h:33
static int decoder_get_length(ndn_decoder_t *decoder, uint32_t *length)
Get the variable size Length (L).
Definition: decoder.h:103
static int decoder_get_type(ndn_decoder_t *decoder, uint32_t *type)
Get the variable size Type (T).
Definition: decoder.h:90
static int decoder_get_uint_value(ndn_decoder_t *decoder, uint32_t length, uint64_t *value)
Get the non-negative int Value (V) to a uint64_t.
Definition: decoder.h:216
static int decoder_get_uint32_value(ndn_decoder_t *decoder, uint32_t *value)
Get the fixed size Value (V) to a uint32_t.
Definition: decoder.h:173