SOme change to support encoding multiple tags; not yet complete
diff --git a/src/qcbor_encode.c b/src/qcbor_encode.c
index ece04e4..7a93614 100644
--- a/src/qcbor_encode.c
+++ b/src/qcbor_encode.c
@@ -319,36 +319,35 @@
}
-static void AddBytesInternal(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, UsefulBufC Bytes, uint8_t uMajorType);
+
/*
- Add an optional label and optional tag. It will go in front of a real data item.
+ Internal function for adding positive and negative integers of all different sizes
*/
-static void AddLabelAndOptionalTag(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag)
+void InsertInt64(QCBOREncodeContext *me, int64_t nNum, uint32_t uPos)
{
- if(szLabel) {
- UsefulBufC SZText = {szLabel, strlen(szLabel)};
- AddBytesInternal(me, NULL, nLabel, CBOR_TAG_NONE, SZText, CBOR_MAJOR_TYPE_TEXT_STRING);
- } else if (QCBOR_NO_INT_LABEL != nLabel) {
- // Add an integer label. This is just adding an integer at this point
- // This will result in a call right back to here, but the call won't do anything
- // because of the params NULL, QCBOR_NO_INT_LABEL and CBOR_TAG_NONE
- QCBOREncode_AddInt64_3(me, NULL, QCBOR_NO_INT_LABEL, CBOR_TAG_NONE, nLabel);
+ uint8_t uMajorType;
+ uint64_t uValue;
+
+ if(nNum < 0) {
+ uValue = (uint64_t)(-nNum - 1); // This is the way negative ints work in CBOR. -1 encodes as 0x00 with major type negative int.
+ uMajorType = CBOR_MAJOR_TYPE_NEGATIVE_INT;
+ } else {
+ uValue = (uint64_t)nNum;
+ uMajorType = CBOR_MAJOR_TYPE_POSITIVE_INT;
}
- if(uTag != CBOR_TAG_NONE) {
- AppendEncodedTypeAndNumber(me, CBOR_MAJOR_TYPE_OPTIONAL, uTag);
- }
+
+ InsertEncodedTypeAndNumber(me, uMajorType, 0, uValue, uPos);
}
-
/*
Does the work of adding some bytes to the CBOR output. Works for a
byte and text strings, which are the same in in CBOR though they have
different major types. This is also used to insert raw
pre-encoded CBOR.
*/
-static void AddBytesInternal(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, UsefulBufC Bytes, uint8_t uMajorType)
+static void AddBytesInternal2(QCBOREncodeContext *me, UsefulBufC Bytes, uint8_t uMajorType, uint32_t uPos)
{
if(Bytes.len >= UINT32_MAX) {
// This implementation doesn't allow buffers larger than UINT32_MAX. This is
@@ -359,17 +358,20 @@
} else {
- AddLabelAndOptionalTag(me, szLabel, nLabel, uTag);
-
if(!me->uError) {
-
+
// If it is not Raw CBOR, add the type and the length
+ uint32_t xx = (uint32_t)UsefulOutBuf_GetEndPosition(&(me->OutBuf));
if(uMajorType != CBOR_MAJOR_NONE_TYPE_RAW) {
- AppendEncodedTypeAndNumber(me, uMajorType, Bytes.len);
+ InsertEncodedTypeAndNumber(me, uMajorType, 0, Bytes.len, uPos);
}
+ uint32_t yy = (uint32_t)UsefulOutBuf_GetEndPosition(&(me->OutBuf));
+ uPos += yy-xx;
+
// Actually add the bytes
- UsefulOutBuf_AppendUsefulBuf(&(me->OutBuf), Bytes);
+ // TODO: how do we know where to insert this?
+ UsefulOutBuf_InsertUsefulBuf(&(me->OutBuf), Bytes, uPos);
// Update the array counting if there is any nesting at all
me->uError = Nesting_Increment(&(me->nesting), 1);
@@ -377,25 +379,69 @@
}
}
+/*
+ Add an optional label. It will go in front of a real data item.
+ */
+
+static void AddLabel(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel)
+{
+ uint32_t uPos = (uint32_t)UsefulOutBuf_GetEndPosition(&(me->OutBuf)); // TODO: justify cast
+ if(Nesting_GetMajorType(&(me->nesting)) == 0x1f) {
+ uPos = Nesting_GetStartPos(&(me->nesting));
+ Nesting_Decrease(&(me->nesting));
+ }
+
+ if(szLabel) {
+ UsefulBufC SZText = UsefulBuf_FromSZ(szLabel);
+ AddBytesInternal2(me, SZText, CBOR_MAJOR_TYPE_TEXT_STRING, uPos);
+ } else if (QCBOR_NO_INT_LABEL != nLabel) {
+ InsertInt64(me, nLabel, uPos);
+ }
+}
/*
+ Public Function
+ */
+void QCBOREncode_AddTag(QCBOREncodeContext *me, uint64_t uTag)
+{
+ uint8_t uNestingType = Nesting_GetMajorType(&(me->nesting));
+ if(uNestingType == CBOR_MAJOR_TYPE_MAP) {
+ // Remember where the first tag is for this item
+ // So we can go back and insert the label in front of it.
+ me->uError = Nesting_Increase(&(me->nesting), 0x1f, (uint32_t)UsefulOutBuf_GetEndPosition(&(me->OutBuf)));
+ }
+
+ AppendEncodedTypeAndNumber(me, CBOR_MAJOR_TYPE_OPTIONAL, uTag);
+}
+
+
+
+void QCBOREncode_AddBytes_2(QCBOREncodeContext *me, uint8_t uMajorType, const char *szLabel, int64_t nLabel, UsefulBufC Bytes)
+{
+ AddLabel(me, szLabel, nLabel);
+ if(!me->uError) {
+ AddBytesInternal2(me, Bytes, uMajorType, (uint32_t)UsefulOutBuf_GetEndPosition(&(me->OutBuf)));
+ }
+}
+
+/*
Public functions for adding strings and raw encoded CBOR. See header qcbor.h
*/
void QCBOREncode_AddBytes_3(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, UsefulBufC Bytes)
{
- AddBytesInternal(me, szLabel, nLabel, uTag, Bytes, CBOR_MAJOR_TYPE_BYTE_STRING);
+ QCBOREncode_AddBytes_2(me, CBOR_MAJOR_TYPE_BYTE_STRING, szLabel, nLabel, Bytes);
}
void QCBOREncode_AddText_3(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, UsefulBufC Bytes)
{
- AddBytesInternal(me, szLabel, nLabel, uTag, Bytes, CBOR_MAJOR_TYPE_TEXT_STRING);
+ QCBOREncode_AddBytes_2(me, CBOR_MAJOR_TYPE_TEXT_STRING, szLabel, nLabel, Bytes);
}
void QCBOREncode_AddEncodedToMap_3(QCBOREncodeContext *me, const char *szLabel, uint64_t nLabel, uint64_t uTag, UsefulBufC Encoded)
{
- AddBytesInternal(me, szLabel, nLabel, uTag, Encoded, CBOR_MAJOR_NONE_TYPE_RAW);
+ QCBOREncode_AddBytes_2(me, CBOR_MAJOR_NONE_TYPE_RAW, szLabel, nLabel, Encoded);
}
@@ -407,9 +453,9 @@
successfully. Call it one more time gives an error.
*/
-static void OpenMapOrArrayInternal(QCBOREncodeContext *me, uint8_t uMajorType, const char *szLabel, uint64_t nLabel, uint64_t uTag)
+static void OpenMapOrArrayInternal(QCBOREncodeContext *me, uint8_t uMajorType, const char *szLabel, uint64_t nLabel)
{
- AddLabelAndOptionalTag(me, szLabel, nLabel, uTag);
+ AddLabel(me, szLabel, nLabel);
if(!me->uError) {
// Add one item to the nesting level we are in for the new map or array
@@ -429,17 +475,17 @@
*/
void QCBOREncode_OpenArray_3(QCBOREncodeContext *me, const char *szLabel, uint64_t nLabel, uint64_t uTag)
{
- OpenMapOrArrayInternal(me, CBOR_MAJOR_TYPE_ARRAY, szLabel, nLabel, uTag);
+ OpenMapOrArrayInternal(me, CBOR_MAJOR_TYPE_ARRAY, szLabel, nLabel);
}
void QCBOREncode_OpenMap_3(QCBOREncodeContext *me, const char *szLabel, uint64_t nLabel, uint64_t uTag)
{
- OpenMapOrArrayInternal(me, CBOR_MAJOR_TYPE_MAP, szLabel, nLabel, uTag);
+ OpenMapOrArrayInternal(me, CBOR_MAJOR_TYPE_MAP, szLabel, nLabel);
}
void QCBOREncode_OpenBstrWrap_3(QCBOREncodeContext *me, const char *szLabel, uint64_t nLabel, uint64_t uTag)
{
- OpenMapOrArrayInternal(me, CBOR_MAJOR_TYPE_BYTE_STRING, szLabel, nLabel, uTag);
+ OpenMapOrArrayInternal(me, CBOR_MAJOR_TYPE_BYTE_STRING, szLabel, nLabel);
}
void QCBOREncode_Close(QCBOREncodeContext *me, uint8_t uMajorType, UsefulBufC *pWrappedCBOR)
@@ -492,40 +538,25 @@
/*
- Internal function for adding positive and negative integers of all different sizes
+ Public functions for adding integers. See header qcbor.h
*/
-static void AddUInt64Internal(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, uint8_t uMajorType, uint64_t n)
+
+void QCBOREncode_AddUInt64_2(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uNum)
{
- AddLabelAndOptionalTag(me, szLabel, nLabel, uTag);
+ AddLabel(me, szLabel, nLabel);
if(!me->uError) {
- AppendEncodedTypeAndNumber(me, uMajorType, n);
+ AppendEncodedTypeAndNumber(me, CBOR_MAJOR_TYPE_POSITIVE_INT, uNum);
me->uError = Nesting_Increment(&(me->nesting), 1);
}
}
-
-/*
- Public functions for adding integers. See header qcbor.h
- */
-void QCBOREncode_AddUInt64_3(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, uint64_t uNum)
+void QCBOREncode_AddInt64_2(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, int64_t nNum)
{
- AddUInt64Internal(me, szLabel, nLabel, uTag, CBOR_MAJOR_TYPE_POSITIVE_INT, uNum);
-}
-
-void QCBOREncode_AddInt64_3(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, int64_t nNum)
-{
- uint8_t uMajorType;
- uint64_t uValue;
-
- // Handle CBOR's particular format for positive and negative integers
- if(nNum < 0) {
- uValue = (uint64_t)(-nNum - 1); // This is the way negative ints work in CBOR. -1 encodes as 0x00 with major type negative int.
- uMajorType = CBOR_MAJOR_TYPE_NEGATIVE_INT;
- } else {
- uValue = (uint64_t)nNum;
- uMajorType = CBOR_MAJOR_TYPE_POSITIVE_INT;
+ AddLabel(me, szLabel, nLabel);
+ if(!me->uError) {
+ InsertInt64(me, nNum, (uint32_t)UsefulOutBuf_GetEndPosition(&(me->OutBuf)));
+ me->uError = Nesting_Increment(&(me->nesting), 1);
}
- AddUInt64Internal(me, szLabel, nLabel, uTag, uMajorType, uValue);
}
@@ -547,7 +578,7 @@
*/
static void AddSimpleInternal(QCBOREncodeContext *me, const char *szLabel, int64_t nLabel, uint64_t uTag, size_t uSize, uint64_t uNum)
{
- AddLabelAndOptionalTag(me, szLabel, nLabel, uTag);
+ AddLabel(me, szLabel, nLabel);
if(!me->uError) {
// This function call takes care of endian swapping for the float / double
InsertEncodedTypeAndNumber(me,