Lines Matching refs:coder

85 /// Copies data from in[*in_pos] into coder->temp until
86 /// coder->temp_pos == coder->temp_size. This also keeps coder->file_cur_pos
89 fill_temp(lzma_file_info_coder *coder, const uint8_t *restrict in,
92 coder->file_cur_pos += lzma_bufcpy(in, in_pos, in_size,
93 coder->temp, &coder->temp_pos, coder->temp_size);
94 return coder->temp_pos < coder->temp_size;
107 seek_to_pos(lzma_file_info_coder *coder, uint64_t target_pos,
112 assert(coder->file_size - coder->file_cur_pos >= in_size - *in_pos);
114 const uint64_t pos_min = coder->file_cur_pos - (*in_pos - in_start);
115 const uint64_t pos_max = coder->file_cur_pos + (in_size - *in_pos);
124 *in_pos += (size_t)(target_pos - coder->file_cur_pos);
128 *coder->external_seek_pos = target_pos;
142 coder->file_cur_pos = target_pos;
148 /// The caller sets coder->file_target_pos so that it points to the *end*
151 /// can be used to read data into coder->temp. When fill_temp() has finished,
152 /// coder->temp[coder->temp_size] will match coder->file_target_pos.
154 /// This also validates that coder->target_file_pos is sane in sense that
158 reverse_seek(lzma_file_info_coder *coder,
164 if (coder->file_target_pos < 2 * LZMA_STREAM_HEADER_SIZE)
167 coder->temp_pos = 0;
175 if (coder->file_target_pos - LZMA_STREAM_HEADER_SIZE
176 < sizeof(coder->temp))
177 coder->temp_size = (size_t)(coder->file_target_pos
180 coder->temp_size = sizeof(coder->temp);
184 // LZMA_STREAM_HEADER_SIZE bytes in coder->temp.
185 assert(coder->temp_size >= LZMA_STREAM_HEADER_SIZE);
187 if (seek_to_pos(coder, coder->file_target_pos - coder->temp_size,
223 /// Calls the Index decoder and updates coder->index_remaining.
225 /// from the application or from coder->temp.
227 decode_index(lzma_file_info_coder *coder, const lzma_allocator *allocator,
233 const lzma_ret ret = coder->index_decoder.code(
234 coder->index_decoder.coder,
238 coder->index_remaining -= *in_pos - in_start;
241 coder->file_cur_pos += *in_pos - in_start;
256 lzma_file_info_coder *coder = coder_ptr;
261 assert(coder->file_size >= coder->file_cur_pos);
262 if (coder->file_size - coder->file_cur_pos < in_size - in_start)
264 + (size_t)(coder->file_size - coder->file_cur_pos);
267 switch (coder->sequence) {
271 // are stored in coder->first_header_flags so that we
276 if (coder->file_size < LZMA_STREAM_HEADER_SIZE)
279 // Read the Stream Header field into coder->temp.
280 if (fill_temp(coder, in, in_pos, in_size))
287 &coder->first_header_flags, coder->temp));
295 if (coder->file_size > LZMA_VLI_MAX || (coder->file_size & 3))
300 coder->file_target_pos = coder->file_size;
305 coder->sequence = SEQ_PADDING_DECODE;
307 coder, in_start, in_pos, in_size));
312 // Copy to coder->temp first. This keeps the code simpler if
314 if (fill_temp(coder, in, in_pos, in_size))
320 coder->temp, coder->temp_size);
321 coder->stream_padding += new_padding;
327 coder->file_target_pos -= new_padding;
329 if (new_padding == coder->temp_size) {
332 coder->sequence = SEQ_PADDING_SEEK;
337 if (coder->stream_padding & 3)
340 coder->sequence = SEQ_FOOTER;
342 // Calculate the amount of non-padding data in coder->temp.
343 coder->temp_size -= new_padding;
344 coder->temp_pos = coder->temp_size;
347 // is already in coder->temp. In that case SEQ_FOOTER won't
349 // coder->temp[coder->temp_size - LZMA_STREAM_HEADER_SIZE].
352 // that Stream Footer will be at the end of coder->temp.
354 // field into coder->temp without needing a separate seek
356 if (coder->temp_size < LZMA_STREAM_HEADER_SIZE)
358 coder, in_start, in_pos, in_size));
364 // Copy the Stream Footer field into coder->temp.
365 // If Stream Footer was already available in coder->temp
367 if (fill_temp(coder, in, in_pos, in_size))
370 // Make coder->file_target_pos and coder->temp_size point
372 // of the Index field. coder->temp_pos will be updated
374 coder->file_target_pos -= LZMA_STREAM_HEADER_SIZE;
375 coder->temp_size -= LZMA_STREAM_HEADER_SIZE;
379 &coder->footer_flags,
380 coder->temp + coder->temp_size)));
390 if (coder->file_target_pos < coder->footer_flags.backward_size
395 coder->file_target_pos -= coder->footer_flags.backward_size;
396 coder->sequence = SEQ_INDEX_INIT;
399 // already available in coder->temp.
400 if (coder->temp_size >= coder->footer_flags.backward_size) {
401 // Set coder->temp_pos to point to the beginning
403 coder->temp_pos = coder->temp_size
404 - coder->footer_flags.backward_size;
407 // useful data (Index or anything else) in coder->temp.
408 coder->temp_pos = 0;
409 coder->temp_size = 0;
412 if (seek_to_pos(coder, coder->file_target_pos,
432 if (coder->combined_index != NULL) {
433 memused = lzma_index_memused(coder->combined_index);
434 assert(memused <= coder->memlimit);
435 if (memused > coder->memlimit) // Extra sanity check
441 &coder->index_decoder, allocator,
442 &coder->this_index,
443 coder->memlimit - memused));
445 coder->index_remaining = coder->footer_flags.backward_size;
446 coder->sequence = SEQ_INDEX_DECODE;
453 // in coder->temp, read it from there. Otherwise read from
455 // coder->index_remaining and optionally coder->file_cur_pos.
457 if (coder->temp_size != 0) {
458 assert(coder->temp_size - coder->temp_pos
459 == coder->index_remaining);
460 ret = decode_index(coder, allocator, coder->temp,
461 &coder->temp_pos, coder->temp_size,
467 if (in_size - *in_pos > coder->index_remaining)
469 + (size_t)(coder->index_remaining);
471 ret = decode_index(coder, allocator,
480 if (coder->index_remaining == 0)
484 // coder->temp because when reading from coder->temp
486 // coder->index_remaining bytes of input.
487 assert(coder->temp_size == 0);
495 if (coder->index_remaining != 0)
510 = lzma_index_total_size(coder->this_index)
517 // coder->file_target_pos still points to the beginning of
519 if (coder->file_target_pos < seek_amount)
523 coder->file_target_pos -= seek_amount;
525 if (coder->file_target_pos == 0) {
529 // coder->first_header_flags to avoid the seek.
530 coder->header_flags = coder->first_header_flags;
531 coder->sequence = SEQ_HEADER_COMPARE;
535 coder->sequence = SEQ_HEADER_DECODE;
537 // Make coder->file_target_pos point to the end of
539 coder->file_target_pos += LZMA_STREAM_HEADER_SIZE;
541 // If coder->temp_size is non-zero, it points to the end
543 // field is at coder->temp[coder->temp_size
544 // - coder->footer_flags.backward_size].
545 assert(coder->temp_size == 0 || coder->temp_size
546 >= coder->footer_flags.backward_size);
548 // If coder->temp contained the whole Index, see if it has
556 if (coder->temp_size != 0 && coder->temp_size
557 - coder->footer_flags.backward_size
561 // the start of Stream Header from coder->temp[
562 // coder->temp_size - LZMA_STREAM_HEADER_SIZE].
563 coder->temp_pos = coder->temp_size
564 - coder->footer_flags.backward_size
567 coder->temp_size = coder->temp_pos;
570 // coder->temp. With typical multi-Stream files we
572 // of the *previous* Stream in coder->temp and thus
574 return_if_error(reverse_seek(coder,
582 // Copy the Stream Header field into coder->temp.
583 // If Stream Header was already available in coder->temp
585 if (fill_temp(coder, in, in_pos, in_size))
589 coder->file_target_pos -= LZMA_STREAM_HEADER_SIZE;
590 coder->temp_size -= LZMA_STREAM_HEADER_SIZE;
591 coder->temp_pos = coder->temp_size;
595 &coder->header_flags,
596 coder->temp + coder->temp_size)));
598 coder->sequence = SEQ_HEADER_COMPARE;
606 &coder->header_flags, &coder->footer_flags));
611 if (lzma_index_stream_flags(coder->this_index,
612 &coder->footer_flags) != LZMA_OK)
617 if (lzma_index_stream_padding(coder->this_index,
618 coder->stream_padding) != LZMA_OK)
622 coder->stream_padding = 0;
625 if (coder->combined_index != NULL)
626 return_if_error(lzma_index_cat(coder->this_index,
627 coder->combined_index, allocator));
629 coder->combined_index = coder->this_index;
630 coder->this_index = NULL;
634 if (coder->file_target_pos == 0) {
637 assert(lzma_index_file_size(coder->combined_index)
638 == coder->file_size);
642 *coder->dest_index = coder->combined_index;
643 coder->combined_index = NULL;
656 // data in coder->temp, use it before requesting more data
659 // coder->file_target_pos, coder->temp_size, and
660 // coder->temp_pos all point to the beginning of Stream Header
662 coder->sequence = coder->temp_size > 0
677 lzma_file_info_coder *coder = coder_ptr;
682 // coder->combined_index.
684 // (2) The latest Index in coder->this_index that has been decoded but
685 // not yet put into coder->combined_index.
688 // finished and thus isn't available in coder->this_index yet.
690 // from/to coder->index_decoder.
699 if (coder->combined_index != NULL)
701 coder->combined_index);
704 if (coder->this_index != NULL) {
706 this_index_memusage = lzma_index_memused(coder->this_index);
708 } else if (coder->sequence == SEQ_INDEX_DECODE) {
710 // the new index in coder->this_index. Get the memory usage
716 if (coder->index_decoder.memconfig(coder->index_decoder.coder,
733 *old_memlimit = coder->memlimit;
742 if (coder->this_index == NULL
743 && coder->sequence == SEQ_INDEX_DECODE) {
753 if (coder->index_decoder.memconfig(
754 coder->index_decoder.coder,
762 coder->memlimit = new_memlimit;
772 lzma_file_info_coder *coder = coder_ptr;
774 lzma_next_end(&coder->index_decoder, allocator);
775 lzma_index_end(coder->this_index, allocator);
776 lzma_index_end(coder->combined_index, allocator);
778 lzma_free(coder, allocator);
794 lzma_file_info_coder *coder = next->coder;
795 if (coder == NULL) {
796 coder = lzma_alloc(sizeof(lzma_file_info_coder), allocator);
797 if (coder == NULL)
800 next->coder = coder;
805 coder->index_decoder = LZMA_NEXT_CODER_INIT;
806 coder->this_index = NULL;
807 coder->combined_index = NULL;
810 coder->sequence = SEQ_MAGIC_BYTES;
811 coder->file_cur_pos = 0;
812 coder->file_target_pos = 0;
813 coder->file_size = file_size;
815 lzma_index_end(coder->this_index, allocator);
816 coder->this_index = NULL;
818 lzma_index_end(coder->combined_index, allocator);
819 coder->combined_index = NULL;
821 coder->stream_padding = 0;
823 coder->dest_index = dest_index;
824 coder->external_seek_pos = seek_pos;
828 coder->memlimit = my_max(1, memlimit);
830 // Prepare these for reading the first Stream Header into coder->temp.
831 coder->temp_pos = 0;
832 coder->temp_size = LZMA_STREAM_HEADER_SIZE;