// internal inplace reader for when it straddles the end of the buffer static const char* mpack_read_bytes_inplace_big(mpack_reader_t* reader, size_t count) { // we should only arrive here from inplace straddle; this should already be checked mpack_assert(mpack_reader_error(reader) == mpack_ok, "already in error state? %s", mpack_error_to_string(mpack_reader_error(reader))); mpack_assert(reader->left < count, "already enough bytes in buffer: %i left, %i count", (int)reader->left, (int)count); // we'll need a fill function to get more data. if there's no // fill function, the buffer should contain an entire MessagePack // object, so we raise mpack_error_invalid instead of mpack_error_io // on truncated data. if (reader->fill == NULL) { mpack_reader_flag_error(reader, mpack_error_invalid); return NULL; } // make sure the buffer is big enough to actually fit the data if (count > reader->size) { mpack_reader_flag_error(reader, mpack_error_too_big); return NULL; } // re-fill as much as possible mpack_partial_fill(reader); if (reader->left < count) { mpack_reader_flag_error(reader, mpack_error_io); return NULL; } reader->pos += count; reader->left -= count; return reader->buffer; }
void mpack_writer_flag_error(mpack_writer_t* writer, mpack_error_t error) { mpack_log("writer %p setting error %i: %s\n", writer, (int)error, mpack_error_to_string(error)); if (writer->error == mpack_ok) { writer->error = error; if (writer->error_fn) writer->error_fn(writer, writer->error); } }
void mpack_reader_flag_error(mpack_reader_t* reader, mpack_error_t error) { mpack_log("reader %p setting error %i: %s\n", reader, (int)error, mpack_error_to_string(error)); if (reader->error == mpack_ok) { reader->error = error; reader->left = 0; if (reader->error_fn) reader->error_fn(reader, error); } }
void mpack_print_file(const char* data, size_t len, FILE* file) { mpack_assert(data != NULL, "data is NULL"); mpack_assert(file != NULL, "file is NULL"); mpack_reader_t reader; mpack_reader_init_data(&reader, data, len); int depth = 2; for (int i = 0; i < depth; ++i) fprintf(file, " "); mpack_print_element(&reader, depth, file); putc('\n', file); size_t remaining = mpack_reader_remaining(&reader, NULL); if (mpack_reader_destroy(&reader) != mpack_ok) fprintf(file, "<mpack parsing error %s>\n", mpack_error_to_string(mpack_reader_error(&reader))); else if (remaining > 0) fprintf(file, "<%i extra bytes at end of mpack>\n", (int)remaining); }