Skip to content

Commit 86ab648

Browse files
committed
Fix buffer writer
- Re-adding APIs for cbor_encoder_get_extra_bytes_needed() and cbor_encoder_get_buffer_size() as part of cbor_buf_writer APIs - Add bytes_needed field to the buf writer
1 parent a2fb0bc commit 86ab648

File tree

5 files changed

+35
-7
lines changed

5 files changed

+35
-7
lines changed

include/tinycbor/cbor_buf_writer.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,28 @@ struct cbor_buf_writer {
3333
struct cbor_encoder_writer enc;
3434
uint8_t *ptr;
3535
const uint8_t *end;
36+
int bytes_needed;
3637
};
3738

3839
void cbor_buf_writer_init(struct cbor_buf_writer *cb, uint8_t *buffer,
3940
size_t data);
4041
size_t cbor_buf_writer_buffer_size(struct cbor_buf_writer *cb,
4142
const uint8_t *buffer);
43+
44+
CBOR_INLINE_API size_t cbor_encoder_get_extra_bytes_needed(const CborEncoder *encoder)
45+
{
46+
struct cbor_buf_writer *wr = (struct cbor_buf_writer *)encoder->writer;
47+
48+
return wr->end ? 0 : (size_t)wr->bytes_needed;
49+
}
50+
51+
CBOR_INLINE_API size_t cbor_encoder_get_buffer_size(const CborEncoder *encoder, const uint8_t *buffer)
52+
{
53+
struct cbor_buf_writer *wr = (struct cbor_buf_writer *)encoder->writer;
54+
55+
return (size_t)(wr->ptr - buffer);
56+
}
57+
4258
#ifdef __cplusplus
4359
}
4460
#endif

src/cbor_buf_writer.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ static inline int
2929
would_overflow(struct cbor_buf_writer *cb, size_t len)
3030
{
3131
ptrdiff_t remaining = (ptrdiff_t)cb->end;
32+
33+
if (!remaining)
34+
return 1;
3235
remaining -= (ptrdiff_t)cb->ptr;
3336
remaining -= (ptrdiff_t)len;
3437
return (remaining < 0);
@@ -40,6 +43,14 @@ cbor_buf_writer(struct cbor_encoder_writer *arg, const char *data, int len)
4043
struct cbor_buf_writer *cb = (struct cbor_buf_writer *) arg;
4144

4245
if (would_overflow(cb, len)) {
46+
if (cb->end != NULL) {
47+
len -= cb->end - cb->ptr;
48+
cb->end = NULL;
49+
cb->bytes_needed = 0;
50+
}
51+
52+
cb->bytes_needed += len;
53+
4354
return CborErrorOutOfMemory;
4455
}
4556

@@ -55,6 +66,7 @@ cbor_buf_writer_init(struct cbor_buf_writer *cb, uint8_t *buffer, size_t size)
5566
cb->ptr = buffer;
5667
cb->end = buffer + size;
5768
cb->enc.bytes_written = 0;
69+
cb->bytes_needed = 0;
5870
cb->enc.write = cbor_buf_writer;
5971
}
6072

src/cborencoder.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ CborError cbor_encode_tag(CborEncoder *encoder, CborTag tag)
382382
static CborError encode_string(CborEncoder *encoder, size_t length, uint8_t shiftedMajorType, const void *string)
383383
{
384384
CborError err = encode_number(encoder, length, shiftedMajorType);
385-
if (err && isOomError(err))
385+
if (err && !isOomError(err))
386386
return err;
387387
return append_to_buffer(encoder, string, length);
388388
}

tests/encoder/tst_encoder.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,9 @@ void compare(const QVariant &input, const QByteArray &output)
266266

267267
QCOMPARE(int(encodeVariant(&encoder, input)), int(CborNoError));
268268
QCOMPARE(encoder.added, size_t(1));
269-
//QCOMPARE(cbor_encoder_get_extra_bytes_needed(&encoder), size_t(0));
269+
QCOMPARE(cbor_encoder_get_extra_bytes_needed(&encoder), size_t(0));
270270

271-
//buffer.resize(int(cbor_encoder_get_buffer_size(&encoder, bufptr)));
271+
buffer.resize(int(cbor_encoder_get_buffer_size(&encoder, bufptr)));
272272
QCOMPARE(buffer, output);
273273
}
274274

@@ -611,8 +611,8 @@ void tst_Encoder::shortBuffer()
611611
cbor_encoder_init(&encoder, &wr.enc, 0);
612612

613613
QCOMPARE(int(encodeVariant(&encoder, input)), int(CborErrorOutOfMemory));
614-
//QVERIFY(cbor_encoder_get_extra_bytes_needed(&encoder) != 0);
615-
//QCOMPARE(len + cbor_encoder_get_extra_bytes_needed(&encoder), size_t(output.length()));
614+
QVERIFY(cbor_encoder_get_extra_bytes_needed(&encoder) != 0);
615+
QCOMPARE(len + cbor_encoder_get_extra_bytes_needed(&encoder), size_t(output.length()));
616616
}
617617
}
618618

tests/tojson/tst_tojson.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ void compareOne_real(const QByteArray &data, const QString &expected, int flags,
229229
QCOMPARE(decoded, expected);
230230

231231
// check that we consumed everything
232-
//QCOMPARE((void*)first.ptr, (void*)data.constEnd());
232+
QCOMPARE(cbor_value_at_end(&first), true);
233233

234234
compareFailed = false;
235235
}
@@ -675,7 +675,7 @@ void compareMetaData(QByteArray data, const QString &expected, int otherFlags =
675675
"\"; decoded stream:\n" + decoded.toLatin1());
676676

677677
// check that we consumed everything
678-
//QCOMPARE((void*)first.ptr, (void*)data.constEnd());
678+
QCOMPARE(cbor_value_at_end(&first), true);
679679
}
680680

681681
QVERIFY(decoded.startsWith("{\"v\":"));

0 commit comments

Comments
 (0)