blob: 2e4e103ca4606ca15d3ff4daf2c1c551cab69e11 [file] [log] [blame]
Jeff Thompson76317aa2013-06-25 19:11:48 -07001/*
2 * Author: Jeff Thompson
3 *
4 * BSD license, See the LICENSE file for more information.
5 */
6
7#include "BinaryXML.h"
8#include "BinaryXMLDecoder.h"
9
Jeff Thompsond6f13282013-06-27 17:31:50 -070010char *ndn_BinaryXMLDecoder_decodeTypeAndValue(struct ndn_BinaryXMLDecoder *self, unsigned int *type, unsigned int *valueOut)
Jeff Thompson82222e82013-06-26 19:32:59 -070011{
Jeff Thompson76317aa2013-06-25 19:11:48 -070012 unsigned int value = 0;
13
14 while (1) {
Jeff Thompsonf7316692013-06-26 21:31:42 -070015 if (self->offset >= self->inputLength)
Jeff Thompson76317aa2013-06-25 19:11:48 -070016 return "ndn_BinaryXMLDecoder_decodeTypeAndVal read past the end of the input";
17
18 unsigned int octet = (unsigned int)(self->input[self->offset++] & 0xff);
19
20 if (octet & ndn_BinaryXML_TT_FINAL) {
21 // Finished.
22 *type = octet & ndn_BinaryXML_TT_MASK;
23 value = (value << ndn_BinaryXML_TT_VALUE_BITS) | ((octet >> ndn_BinaryXML_TT_BITS) & ndn_BinaryXML_TT_VALUE_MASK);
24 break;
25 }
26
27 value = (value << ndn_BinaryXML_REGULAR_VALUE_BITS) | (octet & ndn_BinaryXML_REGULAR_VALUE_MASK);
28 }
29
30 *valueOut = value;
Jeff Thompsond6f13282013-06-27 17:31:50 -070031 return (char *)0;
Jeff Thompson76317aa2013-06-25 19:11:48 -070032}
Jeff Thompson179d0502013-06-28 11:36:00 -070033
34char *ndn_BinaryXMLDecoder_readDTag(struct ndn_BinaryXMLDecoder *self, unsigned int tag)
35{
36 char *error;
37 unsigned int type;
38 unsigned int value;
39 if (error = ndn_BinaryXMLDecoder_decodeTypeAndValue(self, &type, &value))
40 return error;
41
42 if (type != ndn_BinaryXML_DTAG)
43 return "ndn_BinaryXMLDecoder_readDTag: header type is not a DTAG";
44
45 if (value != tag)
46 return "ndn_BinaryXMLDecoder_readDTag: did not get the expected DTAG";
47
48 return (char *)0;
49}