1/****************************************************************************
2**
3** Copyright (C) 2018 Intel Corporation
4**
5** Permission is hereby granted, free of charge, to any person obtaining a copy
6** of this software and associated documentation files (the "Software"), to deal
7** in the Software without restriction, including without limitation the rights
8** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9** copies of the Software, and to permit persons to whom the Software is
10** furnished to do so, subject to the following conditions:
11**
12** The above copyright notice and this permission notice shall be included in
13** all copies or substantial portions of the Software.
14**
15** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21** THE SOFTWARE.
22**
23****************************************************************************/
24
25#include "cbor.h"
26
27#ifndef _
28# define _(msg) msg
29#endif
30
31/**
32 * \enum CborError
33 * \ingroup CborGlobals
34 * The CborError enum contains the possible error values used by the CBOR encoder and decoder.
35 *
36 * TinyCBOR functions report success by returning CborNoError, or one error
37 * condition by returning one of the values below. One exception is the
38 * out-of-memory condition (CborErrorOutOfMemory), which the functions for \ref
39 * CborEncoding may report in bit-wise OR with other conditions.
40 *
41 * This technique allows code to determine whether the only error condition was
42 * a lack of buffer space, which may not be a fatal condition if the buffer can
43 * be resized. Additionally, the functions for \ref CborEncoding may continue
44 * to be used even after CborErrorOutOfMemory is returned, and instead they
45 * will simply calculate the extra space needed.
46 *
47 * \value CborNoError No error occurred
48 * \omitvalue CborUnknownError
49 * \value CborErrorUnknownLength Request for the length of an array, map or string whose length is not provided in the CBOR stream
50 * \value CborErrorAdvancePastEOF Not enough data in the stream to decode item (decoding would advance past end of stream)
51 * \value CborErrorIO An I/O error occurred, probably due to an out-of-memory situation
52 * \value CborErrorGarbageAtEnd Bytes exist past the end of the CBOR stream
53 * \value CborErrorUnexpectedEOF End of stream reached unexpectedly
54 * \value CborErrorUnexpectedBreak A CBOR break byte was found where not expected
55 * \value CborErrorUnknownType An unknown type (future extension to CBOR) was found in the stream
56 * \value CborErrorIllegalType An invalid type was found while parsing a chunked CBOR string
57 * \value CborErrorIllegalNumber An illegal initial byte (encoding unspecified additional information) was found
58 * \value CborErrorIllegalSimpleType An illegal encoding of a CBOR Simple Type of value less than 32 was found
59 * \omitvalue CborErrorUnknownSimpleType
60 * \omitvalue CborErrorUnknownTag
61 * \omitvalue CborErrorInappropriateTagForType
62 * \omitvalue CborErrorDuplicateObjectKeys
63 * \value CborErrorInvalidUtf8TextString Illegal UTF-8 encoding found while parsing CBOR Text String
64 * \value CborErrorTooManyItems Too many items were added to CBOR map or array of pre-determined length
65 * \value CborErrorTooFewItems Too few items were added to CBOR map or array of pre-determined length
66 * \value CborErrorDataTooLarge Data item size exceeds TinyCBOR's implementation limits
67 * \value CborErrorNestingTooDeep Data item nesting exceeds TinyCBOR's implementation limits
68 * \omitvalue CborErrorUnsupportedType
69 * \value CborErrorJsonObjectKeyIsAggregate Conversion to JSON failed because the key in a map is a CBOR map or array
70 * \value CborErrorJsonObjectKeyNotString Conversion to JSON failed because the key in a map is not a text string
71 * \value CborErrorOutOfMemory During CBOR encoding, the buffer provided is insufficient for encoding the data item;
72 * in other situations, TinyCBOR failed to allocate memory
73 * \value CborErrorInternalError An internal error occurred in TinyCBOR
74 */
75
76/**
77 * \ingroup CborGlobals
78 * Returns the error string corresponding to the CBOR error condition \a error.
79 */
80const char *cbor_error_string(CborError error)
81{
82 switch (error) {
83 case CborNoError:
84 return "";
85
86 case CborUnknownError:
87 return _("unknown error");
88
89 case CborErrorOutOfMemory:
90 return _("out of memory/need more memory");
91
92 case CborErrorUnknownLength:
93 return _("unknown length (attempted to get the length of a map/array/string of indeterminate length");
94
95 case CborErrorAdvancePastEOF:
96 return _("attempted to advance past EOF");
97
98 case CborErrorIO:
99 return _("I/O error");
100
101 case CborErrorGarbageAtEnd:
102 return _("garbage after the end of the content");
103
104 case CborErrorUnexpectedEOF:
105 return _("unexpected end of data");
106
107 case CborErrorUnexpectedBreak:
108 return _("unexpected 'break' byte");
109
110 case CborErrorUnknownType:
111 return _("illegal byte (encodes future extension type)");
112
113 case CborErrorIllegalType:
114 return _("mismatched string type in chunked string");
115
116 case CborErrorIllegalNumber:
117 return _("illegal initial byte (encodes unspecified additional information)");
118
119 case CborErrorIllegalSimpleType:
120 return _("illegal encoding of simple type smaller than 32");
121
122 case CborErrorNoMoreStringChunks:
123 return _("no more byte or text strings available");
124
125 case CborErrorUnknownSimpleType:
126 return _("unknown simple type");
127
128 case CborErrorUnknownTag:
129 return _("unknown tag");
130
131 case CborErrorInappropriateTagForType:
132 return _("inappropriate tag for type");
133
134 case CborErrorDuplicateObjectKeys:
135 return _("duplicate keys in object");
136
137 case CborErrorInvalidUtf8TextString:
138 return _("invalid UTF-8 content in string");
139
140 case CborErrorExcludedType:
141 return _("excluded type found");
142
143 case CborErrorExcludedValue:
144 return _("excluded value found");
145
146 case CborErrorImproperValue:
147 case CborErrorOverlongEncoding:
148 return _("value encoded in non-canonical form");
149
150 case CborErrorMapKeyNotString:
151 case CborErrorJsonObjectKeyNotString:
152 return _("key in map is not a string");
153
154 case CborErrorMapNotSorted:
155 return _("map is not sorted");
156
157 case CborErrorMapKeysNotUnique:
158 return _("map keys are not unique");
159
160 case CborErrorTooManyItems:
161 return _("too many items added to encoder");
162
163 case CborErrorTooFewItems:
164 return _("too few items added to encoder");
165
166 case CborErrorDataTooLarge:
167 return _("internal error: data too large");
168
169 case CborErrorNestingTooDeep:
170 return _("internal error: too many nested containers found in recursive function");
171
172 case CborErrorUnsupportedType:
173 return _("unsupported type");
174
175 case CborErrorUnimplementedValidation:
176 return _("validation not implemented for the current parser state");
177
178 case CborErrorJsonObjectKeyIsAggregate:
179 return _("conversion to JSON failed: key in object is an array or map");
180
181 case CborErrorJsonNotImplemented:
182 return _("conversion to JSON failed: open_memstream unavailable");
183
184 case CborErrorInternalError:
185 return _("internal error");
186 }
187 return cbor_error_string(CborUnknownError);
188}
189