void ScorePost_Read_Record_IMP(ScorePosting *self, InStream *instream) { ScorePostingIVARS *const ivars = ScorePost_IVARS(self); uint32_t position = 0; const size_t max_start_bytes = (C32_MAX_BYTES * 2) + 1; const char *buf = InStream_Buf(instream, max_start_bytes); const uint32_t doc_code = NumUtil_decode_c32(&buf); const uint32_t doc_delta = doc_code >> 1; // Apply delta doc and retrieve freq. ivars->doc_id += doc_delta; if (doc_code & 1) { ivars->freq = 1; } else { ivars->freq = NumUtil_decode_c32(&buf); } // Decode boost/norm byte. ivars->weight = ivars->norm_decoder[*(uint8_t*)buf]; buf++; // Read positions. uint32_t num_prox = ivars->freq; if (num_prox > ivars->prox_cap) { ivars->prox = (uint32_t*)REALLOCATE( ivars->prox, num_prox * sizeof(uint32_t)); ivars->prox_cap = num_prox; } uint32_t *positions = ivars->prox; InStream_Advance_Buf(instream, buf); buf = InStream_Buf(instream, num_prox * C32_MAX_BYTES); while (num_prox--) { position += NumUtil_decode_c32(&buf); *positions++ = position; } InStream_Advance_Buf(instream, buf); }
static void test_Buf(TestBatchRunner *runner) { RAMFile *file = RAMFile_new(NULL, false); OutStream *outstream = OutStream_open((Obj*)file); size_t size = IO_STREAM_BUF_SIZE * 2 + 5; InStream *instream; char *buf; for (uint32_t i = 0; i < size; i++) { OutStream_Write_U8(outstream, 'a'); } OutStream_Close(outstream); instream = InStream_open((Obj*)file); InStreamIVARS *const ivars = InStream_IVARS(instream); buf = InStream_Buf(instream, 5); TEST_INT_EQ(runner, ivars->limit - buf, IO_STREAM_BUF_SIZE, "Small request bumped up"); buf += IO_STREAM_BUF_SIZE - 10; // 10 bytes left in buffer. InStream_Advance_Buf(instream, buf); buf = InStream_Buf(instream, 10); TEST_INT_EQ(runner, ivars->limit - buf, 10, "Exact request doesn't trigger refill"); buf = InStream_Buf(instream, 11); TEST_INT_EQ(runner, ivars->limit - buf, IO_STREAM_BUF_SIZE, "Requesting over limit triggers refill"); int64_t expected = InStream_Length(instream) - InStream_Tell(instream); char *buff = InStream_Buf(instream, 100000); int64_t got = PTR_TO_I64(ivars->limit) - PTR_TO_I64(buff); TEST_TRUE(runner, got == expected, "Requests greater than file size get pared down"); DECREF(instream); DECREF(outstream); DECREF(file); }