Lines Matching defs:iterator
72 static FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator);
73 static FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block);
100 static FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block);
101 static FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last);
102 static FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append);
104 static void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator);
105 static FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator);
110 static FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append);
111 static FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, FLAC__off_t fixup_is_last_flag_offset, FLAC__bool backup);
363 FLAC__Metadata_SimpleIterator *iterator = calloc(1, sizeof(FLAC__Metadata_SimpleIterator));
365 if(0 != iterator) {
366 iterator->file = 0;
367 iterator->filename = 0;
368 iterator->tempfile_path_prefix = 0;
369 iterator->has_stats = false;
370 iterator->is_writable = false;
371 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
372 iterator->first_offset = iterator->offset[0] = -1;
373 iterator->depth = 0;
376 return iterator;
379 static void simple_iterator_free_guts_(FLAC__Metadata_SimpleIterator *iterator)
381 FLAC__ASSERT(0 != iterator);
383 if(0 != iterator->file) {
384 fclose(iterator->file);
385 iterator->file = 0;
386 if(iterator->has_stats)
387 set_file_stats_(iterator->filename, &iterator->stats);
389 if(0 != iterator->filename) {
390 free(iterator->filename);
391 iterator->filename = 0;
393 if(0 != iterator->tempfile_path_prefix) {
394 free(iterator->tempfile_path_prefix);
395 iterator->tempfile_path_prefix = 0;
399 FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator)
401 FLAC__ASSERT(0 != iterator);
403 simple_iterator_free_guts_(iterator);
404 free(iterator);
407 FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator)
411 FLAC__ASSERT(0 != iterator);
413 status = iterator->status;
414 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
418 static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool read_only)
422 FLAC__ASSERT(0 != iterator);
424 if(read_only || 0 == (iterator->file = flac_fopen(iterator->filename, "r+b"))) {
425 iterator->is_writable = false;
427 if(0 == (iterator->file = flac_fopen(iterator->filename, "rb"))) {
428 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
433 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
438 iterator->is_writable = true;
441 ret = seek_to_first_metadata_block_(iterator->file);
444 iterator->depth = 0;
445 iterator->first_offset = iterator->offset[iterator->depth] = ftello(iterator->file);
446 return read_metadata_block_header_(iterator);
448 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
451 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
454 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE;
477 FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool preserve_file_stats, const char *tempfile_path_prefix);
480 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats)
484 FLAC__ASSERT(0 != iterator);
487 simple_iterator_free_guts_(iterator);
490 iterator->has_stats = get_file_stats_(filename, &iterator->stats);
492 if(0 == (iterator->filename = strdup(filename))) {
493 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
496 if(0 != tempfile_path_prefix && 0 == (iterator->tempfile_path_prefix = strdup(tempfile_path_prefix))) {
497 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
501 return simple_iterator_prime_input_(iterator, read_only);
504 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator)
506 FLAC__ASSERT(0 != iterator);
507 FLAC__ASSERT(0 != iterator->file);
509 return iterator->is_writable;
512 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator)
514 FLAC__ASSERT(0 != iterator);
515 FLAC__ASSERT(0 != iterator->file);
517 if(iterator->is_last)
520 if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) {
521 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
525 iterator->offset[iterator->depth] = ftello(iterator->file);
527 return read_metadata_block_header_(iterator);
530 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator)
534 FLAC__ASSERT(0 != iterator);
535 FLAC__ASSERT(0 != iterator->file);
537 if(iterator->offset[iterator->depth] == iterator->first_offset)
540 if(0 != fseeko(iterator->file, iterator->first_offset, SEEK_SET)) {
541 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
544 this_offset = iterator->first_offset;
545 if(!read_metadata_block_header_(iterator))
549 while(ftello(iterator->file) + (FLAC__off_t)iterator->length < iterator->offset[iterator->depth]) {
550 if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) {
551 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
554 this_offset = ftello(iterator->file);
555 if(!read_metadata_block_header_(iterator))
559 iterator->offset[iterator->depth] = this_offset;
565 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator)
567 FLAC__ASSERT(0 != iterator);
568 FLAC__ASSERT(0 != iterator->file);
570 return iterator->is_last;
574 FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator)
576 FLAC__ASSERT(0 != iterator);
577 FLAC__ASSERT(0 != iterator->file);
579 return iterator->offset[iterator->depth];
582 FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator)
584 FLAC__ASSERT(0 != iterator);
585 FLAC__ASSERT(0 != iterator->file);
587 return iterator->type;
591 FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator)
593 FLAC__ASSERT(0 != iterator);
594 FLAC__ASSERT(0 != iterator->file);
596 return iterator->length;
600 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id)
604 FLAC__ASSERT(0 != iterator);
605 FLAC__ASSERT(0 != iterator->file);
608 if(iterator->type != FLAC__METADATA_TYPE_APPLICATION) {
609 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
613 if(fread(id, 1, id_bytes, iterator->file) != id_bytes) {
614 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
619 if(0 != fseeko(iterator->file, -((int)id_bytes), SEEK_CUR)) {
620 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
627 FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator)
629 FLAC__StreamMetadata *block = FLAC__metadata_object_new(iterator->type);
631 FLAC__ASSERT(0 != iterator);
632 FLAC__ASSERT(0 != iterator->file);
635 block->is_last = iterator->is_last;
636 block->length = iterator->length;
638 if(!read_metadata_block_data_(iterator, block)) {
644 if(0 != fseeko(iterator->file, iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH, SEEK_SET)) {
645 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
651 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
656 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding)
658 FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth];)
661 FLAC__ASSERT(0 != iterator);
662 FLAC__ASSERT(0 != iterator->file);
665 if(!iterator->is_writable) {
666 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE;
670 if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO || block->type == FLAC__METADATA_TYPE_STREAMINFO) {
671 if(iterator->type != block->type) {
672 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
677 block->is_last = iterator->is_last;
679 if(iterator->length == block->length)
680 return write_metadata_block_stationary_(iterator, block);
681 else if(iterator->length > block->length) {
682 if(use_padding && iterator->length >= FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) {
683 ret = write_metadata_block_stationary_with_padding_(iterator, block, iterator->length - FLAC__STREAM_METADATA_HEADER_LENGTH - block->length, block->is_last);
684 FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
685 FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
689 ret = rewrite_whole_file_(iterator, block, /*append=*/false);
690 FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
691 FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
695 else /* iterator->length < block->length */ {
700 if(iterator->is_last) {
704 const unsigned extra_padding_bytes_required = block->length - iterator->length;
705 simple_iterator_push_(iterator);
706 if(!FLAC__metadata_simple_iterator_next(iterator)) {
707 (void)simple_iterator_pop_(iterator);
710 if(iterator->type != FLAC__METADATA_TYPE_PADDING) {
714 if(FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length == extra_padding_bytes_required) {
716 block->is_last = iterator->is_last;
718 else if(iterator->length < extra_padding_bytes_required)
721 padding_leftover = FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length - extra_padding_bytes_required;
722 padding_is_last = iterator->is_last;
726 if(!simple_iterator_pop_(iterator))
732 ret = write_metadata_block_stationary_(iterator, block);
733 FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
734 FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
739 ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last);
740 FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
741 FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
746 ret = rewrite_whole_file_(iterator, block, /*append=*/false);
747 FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
748 FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
754 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding)
759 FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length;)
762 FLAC__ASSERT(0 != iterator);
763 FLAC__ASSERT(0 != iterator->file);
766 if(!iterator->is_writable) {
767 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE;
772 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
776 block->is_last = iterator->is_last;
780 if(iterator->is_last) {
784 simple_iterator_push_(iterator);
785 if(!FLAC__metadata_simple_iterator_next(iterator)) {
786 (void)simple_iterator_pop_(iterator);
789 if(iterator->type != FLAC__METADATA_TYPE_PADDING) {
793 if(iterator->length == block->length) {
795 block->is_last = iterator->is_last;
797 else if(iterator->length < FLAC__STREAM_METADATA_HEADER_LENGTH + block->length)
800 padding_leftover = iterator->length - block->length;
801 padding_is_last = iterator->is_last;
805 if(!simple_iterator_pop_(iterator))
811 if(!FLAC__metadata_simple_iterator_next(iterator))
814 ret = write_metadata_block_stationary_(iterator, block);
815 FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
816 FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
821 iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last);
822 FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
823 FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
828 ret = rewrite_whole_file_(iterator, block, /*append=*/true);
829 FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
830 FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
835 FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding)
837 FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth];)
840 if(!iterator->is_writable) {
841 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE;
845 if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO) {
846 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
853 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
856 padding->length = iterator->length;
857 if(!FLAC__metadata_simple_iterator_set_block(iterator, padding, false)) {
862 if(!FLAC__metadata_simple_iterator_prev(iterator))
864 FLAC__ASSERT(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length == debug_target_offset);
865 FLAC__ASSERT(ftello(iterator->file) + (FLAC__off_t)iterator->length == debug_target_offset);
869 ret = rewrite_whole_file_(iterator, 0, /*append=*/false);
870 FLAC__ASSERT(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length == debug_target_offset);
871 FLAC__ASSERT(ftello(iterator->file) + (FLAC__off_t)iterator->length == debug_target_offset);
1036 static void iterator_insert_node_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node)
1040 FLAC__ASSERT(0 != iterator);
1041 FLAC__ASSERT(0 != iterator->current);
1042 FLAC__ASSERT(0 != iterator->chain);
1043 FLAC__ASSERT(0 != iterator->chain->head);
1044 FLAC__ASSERT(0 != iterator->chain->tail);
1048 node->prev = iterator->current->prev;
1049 node->next = iterator->current;
1052 iterator->chain->head = node;
1056 iterator->current->prev = node;
1058 iterator->chain->nodes++;
1061 static void iterator_insert_node_after_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node)
1065 FLAC__ASSERT(0 != iterator);
1066 FLAC__ASSERT(0 != iterator->current);
1067 FLAC__ASSERT(0 != iterator->chain);
1068 FLAC__ASSERT(0 != iterator->chain->head);
1069 FLAC__ASSERT(0 != iterator->chain->tail);
1071 iterator->current->data->is_last = false;
1073 node->prev = iterator->current;
1074 node->next = iterator->current->next;
1077 iterator->chain->tail = node;
1083 iterator->chain->tail->data->is_last = true;
1085 iterator->chain->nodes++;
1893 FLAC__Metadata_Iterator *iterator = calloc(1, sizeof(FLAC__Metadata_Iterator));
1896 iterator->current = 0;
1897 iterator->chain = 0;
1900 return iterator;
1903 FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator)
1905 FLAC__ASSERT(0 != iterator);
1907 free(iterator);
1910 FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain)
1912 FLAC__ASSERT(0 != iterator);
1916 iterator->chain = chain;
1917 iterator->current = chain->head;
1920 FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator)
1922 FLAC__ASSERT(0 != iterator);
1924 if(0 == iterator->current || 0 == iterator->current->next)
1927 iterator->current = iterator->current->next;
1931 FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator)
1933 FLAC__ASSERT(0 != iterator);
1935 if(0 == iterator->current || 0 == iterator->current->prev)
1938 iterator->current = iterator->current->prev;
1942 FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator)
1944 FLAC__ASSERT(0 != iterator);
1945 FLAC__ASSERT(0 != iterator->current);
1946 FLAC__ASSERT(0 != iterator->current->data);
1948 return iterator->current->data->type;
1951 FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator)
1953 FLAC__ASSERT(0 != iterator);
1954 FLAC__ASSERT(0 != iterator->current);
1956 return iterator->current->data;
1959 FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block)
1961 FLAC__ASSERT(0 != iterator);
1963 return FLAC__metadata_iterator_delete_block(iterator, false) && FLAC__metadata_iterator_insert_block_after(iterator, block);
1966 FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding)
1970 FLAC__ASSERT(0 != iterator);
1971 FLAC__ASSERT(0 != iterator->current);
1973 if(0 == iterator->current->prev) {
1974 FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO);
1978 save = iterator->current->prev;
1981 FLAC__metadata_object_delete_data(iterator->current->data);
1982 iterator->current->data->type = FLAC__METADATA_TYPE_PADDING;
1985 chain_delete_node_(iterator->chain, iterator->current);
1988 iterator->current = save;
1992 FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block)
1996 FLAC__ASSERT(0 != iterator);
1997 FLAC__ASSERT(0 != iterator->current);
2003 if(0 == iterator->current->prev) {
2004 FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO);
2012 iterator_insert_node_(iterator, node);
2013 iterator->current = node;
2017 FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block)
2021 FLAC__ASSERT(0 != iterator);
2022 FLAC__ASSERT(0 != iterator->current);
2032 iterator_insert_node_after_(iterator, node);
2033 iterator->current = node;
2113 FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator)
2115 FLAC__ASSERT(0 != iterator);
2116 FLAC__ASSERT(0 != iterator->file);
2118 if(!read_metadata_block_header_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, &iterator->is_last, &iterator->type, &iterator->length)) {
2119 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
2126 FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block)
2128 FLAC__ASSERT(0 != iterator);
2129 FLAC__ASSERT(0 != iterator->file);
2131 iterator->status = read_metadata_block_data_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, block);
2133 return (iterator->status == FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK);
2148 * if(iterator->type >= FLAC__METADATA_TYPE_UNDEFINED)
2928 FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block)
2930 if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
2931 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
2935 if(!write_metadata_block_header_(iterator->file, &iterator->status, block))
2938 if(!write_metadata_block_data_(iterator->file, &iterator->status, block))
2941 if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
2942 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
2946 return read_metadata_block_header_(iterator);
2949 FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last)
2953 if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
2954 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
2960 if(!write_metadata_block_header_(iterator->file, &iterator->status, block))
2963 if(!write_metadata_block_data_(iterator->file, &iterator->status, block))
2972 if(!write_metadata_block_header_(iterator->file, &iterator->status, padding)) {
2977 if(!write_metadata_block_data_(iterator->file, &iterator->status, padding)) {
2984 if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
2985 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
2989 return read_metadata_block_header_(iterator);
2992 FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append)
3001 if(iterator->is_last) {
3004 fixup_is_last_flag_offset = iterator->offset[iterator->depth];
3007 simple_iterator_push_(iterator);
3008 if(!FLAC__metadata_simple_iterator_prev(iterator)) {
3009 (void)simple_iterator_pop_(iterator);
3013 fixup_is_last_flag_offset = iterator->offset[iterator->depth];
3014 if(!simple_iterator_pop_(iterator))
3019 if(!simple_iterator_copy_file_prefix_(iterator, &tempfile, &tempfilename, append))
3023 if(!write_metadata_block_header_(tempfile, &iterator->status, block)) {
3028 if(!write_metadata_block_data_(tempfile, &iterator->status, block)) {
3034 if(!simple_iterator_copy_file_postfix_(iterator, &tempfile, &tempfilename, fixup_is_last_code, fixup_is_last_flag_offset, block==0))
3038 return FLAC__metadata_simple_iterator_next(iterator);
3043 void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator)
3045 FLAC__ASSERT(iterator->depth+1 < SIMPLE_ITERATOR_MAX_PUSH_DEPTH);
3046 iterator->offset[iterator->depth+1] = iterator->offset[iterator->depth];
3047 iterator->depth++;
3050 FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator)
3052 FLAC__ASSERT(iterator->depth > 0);
3053 iterator->depth--;
3054 if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
3055 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
3059 return read_metadata_block_header_(iterator);
3123 FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append)
3125 const FLAC__off_t offset_end = append? iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length : iterator->offset[iterator->depth];
3127 if(0 != fseeko(iterator->file, 0, SEEK_SET)) {
3128 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
3131 if(!open_tempfile_(iterator->filename, iterator->tempfile_path_prefix, tempfile, tempfilename, &iterator->status)) {
3135 if(!copy_n_bytes_from_file_(iterator->file, *tempfile, offset_end, &iterator->status)) {
3143 FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, FLAC__off_t fixup_is_last_flag_offset, FLAC__bool backup)
3145 FLAC__off_t save_offset = iterator->offset[iterator->depth];
3148 if(0 != fseeko(iterator->file, save_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length, SEEK_SET)) {
3150 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
3153 if(!copy_remaining_bytes_from_file_(iterator->file, *tempfile, &iterator->status)) {
3169 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
3174 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
3187 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
3192 iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
3197 (void)fclose(iterator->file);
3199 if(!transport_tempfile_(iterator->filename, tempfile, tempfilename, &iterator->status))
3202 if(iterator->has_stats)
3203 set_file_stats_(iterator->filename, &iterator->stats);
3205 if(!simple_iterator_prime_input_(iterator, !iterator->is_writable))
3208 while(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length < save_offset)
3209 if(!FLAC__metadata_simple_iterator_next(iterator))
3214 /* move the iterator to it's original block faster by faking a push, then doing a pop_ */
3215 FLAC__ASSERT(iterator->depth == 0);
3216 iterator
3217 iterator->depth++;
3218 return simple_iterator_pop_(iterator);