blob: 89f6a9cc6d0fdc2c6439025f74e943dc23739749 [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
Jeff Thompson74ab0812013-06-28 12:25:04 -070034char *ndn_BinaryXMLDecoder_readDTag(struct ndn_BinaryXMLDecoder *self, unsigned int expectedTag)
Jeff Thompson179d0502013-06-28 11:36:00 -070035{
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
Jeff Thompson74ab0812013-06-28 12:25:04 -070045 if (value != expectedTag)
Jeff Thompson179d0502013-06-28 11:36:00 -070046 return "ndn_BinaryXMLDecoder_readDTag: did not get the expected DTAG";
47
48 return (char *)0;
Jeff Thompson74ab0812013-06-28 12:25:04 -070049}
50
51char *ndn_BinaryXMLDecoder_readElementClose(struct ndn_BinaryXMLDecoder *self)
52{
53 if (self->offset >= self->inputLength)
54 return "ndn_BinaryXMLDecoder_readElementClose read past the end of the input";
55
56 unsigned int octet = (unsigned int)(self->input[self->offset++] & 0xff);
57
58 if (octet != ndn_BinaryXML_CLOSE)
59 return "ndn_BinaryXMLDecoder_readDTag: did not get the expected element close";
60
61 return (char *)0;
62}
63
64char *ndn_BinaryXMLDecoder_peekDTag(struct ndn_BinaryXMLDecoder *self, unsigned int expectedTag, int *gotExpectedTag)
65{
66 // Default to 0.
67 *gotExpectedTag = 0;
68
69 unsigned int type;
70 unsigned int value;
71 unsigned int saveOffset = self->offset;
72 char *error = ndn_BinaryXMLDecoder_decodeTypeAndValue(self, &type, &value);
73 self->offset = saveOffset;
74
75 if (error)
76 return error;
77
78 if (type == ndn_BinaryXML_DTAG && value == expectedTag)
79 *gotExpectedTag = 1;
80
81 return (char *)0;
Jeff Thompson179d0502013-06-28 11:36:00 -070082}