Distinguish between the end of the top-level BSON object and an error so that parameter loading can complete.

This commit is contained in:
px4dev
2012-08-28 21:52:26 -07:00
parent 952f862dad
commit f0286d1a10
3 changed files with 37 additions and 17 deletions
+8 -4
View File
@@ -45,13 +45,13 @@
#if 1
# define debug(fmt, args...) do { warnx("BSON:" fmt, ##args); } while(0)
# define debug(fmt, args...) do { warnx("BSON: " fmt, ##args); } while(0)
#else
# define debug(fmt, args...) do { } while(0)
#endif
#define CODER_CHECK(_c) do { if (_c->fd == -1) return -1; } while(0)
#define CODER_KILL(_c, _reason) do { debug("killed:%s", _reason); _c->fd = -1; return -1; } while(0)
#define CODER_KILL(_c, _reason) do { debug("killed: %s", _reason); _c->fd = -1; return -1; } while(0)
static int
read_int8(bson_decoder_t decoder, int8_t *b)
@@ -105,8 +105,12 @@ bson_decoder_next(bson_decoder_t decoder)
decoder->nesting--;
/* if the nesting level is now zero, the top-level document is done */
if (decoder->nesting == 0)
if (decoder->nesting == 0) {
CODER_KILL(decoder, "nesting is zero, document is done");
/* return end-of-file to the caller */
return 0;
}
}
/* if there are unread bytes pending in the stream, discard them */
@@ -247,7 +251,7 @@ bson_encoder_fini(bson_encoder_t encoder)
{
CODER_CHECK(encoder);
if (write_int8(encoder, 0))
if (write_int8(encoder, BSON_EOO))
CODER_KILL(encoder, "write error on document terminator");
return 0;
+14
View File
@@ -108,21 +108,35 @@ struct bson_decoder_s
/**
* Initialise the decoder.
*
* @param decoder Decoder state structure to be initialised.
* @param fd File to read BSON data from.
* @param callback Callback to be invoked by bson_decoder_next
* @param private Callback private data, stored in node.
* @return Zero on success.
*/
__EXPORT int bson_decoder_init(bson_decoder_t decoder, int fd, bson_decoder_callback callback, void *private);
/**
* Process the next node from the stream and invoke the callback.
*
* @param decoder Decoder state, must have been initialised with bson_decoder_init.
* @return -1 if parsing encountered an error, 0 if the BSON stream has ended,
* otherwise the return value from the callback.
*/
__EXPORT int bson_decoder_next(bson_decoder_t decoder);
/**
* Copy node data.
*
* @param decoder Decoder state, must have been initialised with bson_decoder_init.
*/
__EXPORT int bson_decoder_copy_data(bson_decoder_t decoder, void *buf);
/**
* Report copyable data size.
*
* @param decoder Decoder state, must have been initialised with bson_decoder_init.
*/
__EXPORT size_t bson_decoder_data_pending(bson_decoder_t decoder);