void mpack_expect_nil(mpack_reader_t* reader) { mpack_reader_track_element(reader); uint8_t type = mpack_read_native_u8(reader); if (reader->error != mpack_ok) return; if (type != 0xc0) mpack_reader_flag_error(reader, mpack_error_type); }
bool mpack_expect_bool(mpack_reader_t* reader) { mpack_reader_track_element(reader); uint8_t type = mpack_read_native_u8(reader); if (reader->error != mpack_ok) return false; if ((type & ~1) != 0xc2) mpack_reader_flag_error(reader, mpack_error_type); return (bool)(type & 1); }
mpack_tag_t mpack_read_tag(mpack_reader_t* reader) { mpack_log("reading tag\n"); // make sure we can read a tag if (mpack_reader_error(reader) != mpack_ok) return mpack_tag_nil(); if (mpack_reader_track_element(reader) != mpack_ok) return mpack_tag_nil(); mpack_tag_t tag; mpack_memset(&tag, 0, sizeof(tag)); size_t count = mpack_parse_tag(reader, &tag); if (count == 0) return mpack_tag_nil(); #if MPACK_READ_TRACKING mpack_error_t track_error = mpack_ok; switch (tag.type) { case mpack_type_map: case mpack_type_array: track_error = mpack_track_push(&reader->track, tag.type, tag.v.l); break; case mpack_type_str: case mpack_type_bin: case mpack_type_ext: track_error = mpack_track_push(&reader->track, tag.type, tag.v.n); break; default: break; } if (track_error != mpack_ok) { mpack_reader_flag_error(reader, track_error); return mpack_tag_nil(); } #endif // the tag is guaranteed to have been read out of // the buffer, so we advance past it reader->pos += count; reader->left -= count; return tag; }