remove unused code, fix several bugs (WARNING: there are still more)

This commit is contained in:
Josh Coalson 2002-05-09 05:46:23 +00:00
parent f567b91c0f
commit 51ee465678

View File

@ -137,9 +137,7 @@ FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetaD
if(!FLAC__file_decoder_process_metadata(decoder))
return false;
if(FLAC__file_decoder_get_state(decoder) != FLAC__FILE_DECODER_UNINITIALIZED)
FLAC__file_decoder_finish(decoder);
FLAC__file_decoder_finish(decoder);
FLAC__file_decoder_delete(decoder);
return 0 != streaminfo; /* the metadata_callback_() will set streaminfo to 0 on an error */
@ -453,8 +451,12 @@ FLAC__StreamMetaData *FLAC__metadata_simple_iterator_get_block(FLAC__MetaData_Si
FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__MetaData_SimpleIterator *iterator, FLAC__StreamMetaData *block, FLAC__bool use_padding)
{
FLAC__ASSERT_DECLARATION(long debug_target_offset = iterator->offset[iterator->depth];)
FLAC__bool ret;
FLAC__ASSERT(0 != iterator);
FLAC__ASSERT(0 != iterator->file);
/*@@@@fprintf(stderr,"A:460:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
if(!iterator->is_writable) {
iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE;
@ -469,15 +471,24 @@ FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__MetaData_SimpleIterato
}
block->is_last = iterator->is_last;
//@@@@FLAC__metadata_object_calculate_length(block);
if(iterator->length == block->length)
return write_metadata_block_stationary_(iterator, block);
else if(iterator->length > block->length) {
if(use_padding && iterator->length >= 4 + block->length) /*@@@ 4 = MAGIC NUMBER for metadata block header bytes */
return write_metadata_block_stationary_with_padding_(iterator, block, iterator->length - 4 - block->length, block->is_last);
else
return rewrite_whole_file_(iterator, block, /*append=*/false);
if(use_padding && iterator->length >= 4 + block->length) { /*@@@ 4 = MAGIC NUMBER for metadata block header bytes */
ret = write_metadata_block_stationary_with_padding_(iterator, block, iterator->length - 4 - block->length, block->is_last);
/*@@@@fprintf(stderr,"Z:483:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
else {
ret = rewrite_whole_file_(iterator, block, /*append=*/false);
/*@@@@fprintf(stderr,"Z:491:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
}
else /* iterator->length < block->length */ {
unsigned padding_leftover = 0;
@ -488,7 +499,7 @@ FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__MetaData_SimpleIterato
use_padding = false;
}
else {
unsigned existing_block_length = iterator->length;
const unsigned extra_padding_bytes_required = block->length - iterator->length;
simple_iterator_push_(iterator);
if(!FLAC__metadata_simple_iterator_next(iterator)) {
(void)simple_iterator_pop_(iterator);
@ -498,15 +509,14 @@ FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__MetaData_SimpleIterato
use_padding = false;
}
else {
/*@@@ MAGIC NUMBER 4 = metadata block header length, appears 2 times here: */
if(iterator->length == block->length) {
if(4 + iterator->length == extra_padding_bytes_required) { /*@@@ MAGIC NUMBER 4 = metadata block header length */
padding_leftover = 0;
block->is_last = iterator->is_last;
}
else if(iterator->length < 4 + block->length)
else if(iterator->length < extra_padding_bytes_required)
use_padding = false;
else {
padding_leftover = iterator->length - 4 - block->length;
padding_leftover = iterator->length - extra_padding_bytes_required;
padding_is_last = iterator->is_last;
block->is_last = false;
}
@ -516,13 +526,27 @@ FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__MetaData_SimpleIterato
}
}
if(use_padding) {
if(padding_leftover == 0)
return write_metadata_block_stationary_(iterator, block);
else
return write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover, padding_is_last);
if(padding_leftover == 0) {
ret = write_metadata_block_stationary_(iterator, block);
/*@@@@fprintf(stderr,"Z:536:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
else {
ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover, padding_is_last);
/*@@@@fprintf(stderr,"Z:544:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
}
else {
return rewrite_whole_file_(iterator, block, /*append=*/false);
ret = rewrite_whole_file_(iterator, block, /*append=*/false);
/*@@@@fprintf(stderr,"Z:553:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
}
}
@ -532,8 +556,12 @@ FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__MetaData_Simp
unsigned padding_leftover = 0;
FLAC__bool padding_is_last = false;
FLAC__ASSERT_DECLARATION(long debug_target_offset = iterator->offset[iterator->depth] + 4 + iterator->length;)
FLAC__bool ret;
FLAC__ASSERT(0 != iterator);
FLAC__ASSERT(0 != iterator->file);
/*@@@@fprintf(stderr,"A:568:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
if(!iterator->is_writable)
return false;
@ -543,6 +571,9 @@ FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__MetaData_Simp
return false;
}
if(iterator->is_last)
block->is_last = true;
if(use_padding) {
/* first see if we can even use padding */
if(iterator->is_last) {
@ -579,26 +610,36 @@ FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__MetaData_Simp
/* move to the next block, which is suitable padding */
if(!FLAC__metadata_simple_iterator_next(iterator))
return false;
if(padding_leftover == 0)
return write_metadata_block_stationary_(iterator, block);
else
return write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover, padding_is_last);
if(padding_leftover == 0) {
ret = write_metadata_block_stationary_(iterator, block);
/*@@@@fprintf(stderr,"Z:620:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
else {
ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover, padding_is_last);
/*@@@@fprintf(stderr,"Z:628:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
}
else {
return rewrite_whole_file_(iterator, block, /*append=*/true);
ret = rewrite_whole_file_(iterator, block, /*append=*/true);
/*@@@@fprintf(stderr,"Z:637:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) == debug_target_offset + 4);
return ret;
}
}
/*
* Deletes the block at the current position. This will cause the
* entire FLAC file to be rewritten, unless 'use_padding' is true,
* in which case the block will be replaced by an equal-sized PADDING
* block.
*
* You may not delete the STREAMINFO block
*/
FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__MetaData_SimpleIterator *iterator, FLAC__bool use_padding)
{
FLAC__ASSERT_DECLARATION(long debug_target_offset = iterator->offset[iterator->depth];)
FLAC__bool ret;
/*@@@@fprintf(stderr,"A:649:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO) {
iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
return false;
@ -616,10 +657,17 @@ FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__MetaData_SimpleIter
return false;
}
FLAC__metadata_object_delete(padding);
/*@@@@fprintf(stderr,"Z:667:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] + 4 + (long)iterator->length == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) + (long)iterator->length == debug_target_offset);
return true;
}
else {
return rewrite_whole_file_(iterator, 0, /*append=*/false);
ret = rewrite_whole_file_(iterator, 0, /*append=*/false);
/*@@@@fprintf(stderr,"Z:675:offset/length/depth=%ld/%u/%u target=%ld ftell=%ld\n",iterator->offset[iterator->depth],iterator->length,iterator->depth,debug_target_offset,ftell(iterator->file));*/
FLAC__ASSERT(iterator->offset[iterator->depth] + 4 + (long)iterator->length == debug_target_offset);
FLAC__ASSERT(ftell(iterator->file) + (long)iterator->length == debug_target_offset);
return ret;
}
}
@ -877,24 +925,6 @@ FLAC__bool FLAC__metadata_chain_read(FLAC__MetaData_Chain *chain, const char *fi
return true;
}
/*
* Write all metadata out to the FLAC file. This function tries to be as
* efficient as possible; how the metadata is actually written is shown by
* the following:
*
* If the current chain is the same size as the existing metadata, the new
* data is written in place.
*
* If the current chain is longer than the existing metadata, the entire
* FLAC file must be rewritten.
*
* If the current chain is shorted than the existing metadata, and
* use_padding is true, a PADDING block is added to the end of the new
* data to make it the same size as the existing data (if possible, see
* the note to FLAC__metadata_simple_iterator_set_block() about the four
* byte limit) and the new data is written in place. If use_padding is
* false, the entire FLAC file is rewritten.
*/
FLAC__bool FLAC__metadata_chain_write(FLAC__MetaData_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats)
{
struct stat stats;
@ -1294,38 +1324,6 @@ void FLAC__metadata_object_delete(FLAC__StreamMetaData *object)
free(object);
}
#if 0
@@@@ should no longer be needed
void FLAC__metadata_object_calculate_length(FLAC__StreamMetaData *object)
{
unsigned i;
FLAC__ASSERT(0 != object);
switch(type) {
case FLAC__METADATA_TYPE_STREAMINFO:
case FLAC__METADATA_TYPE_PADDING:
/* already calculated on object creation */
break;
case FLAC__METADATA_TYPE_APPLICATION:
case FLAC__METADATA_TYPE_SEEKTABLE:
/* already calculated on object creation or _set */
break;
case FLAC__METADATA_TYPE_VORBIS_COMMENT:
object->length = (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN) / 8;
object->length += object->data.vorbis_comment.vendor_string.length;
object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8;
for(i = 0; i < object->data.vorbis_comment.num_comments; i++) {
object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8);
object->length += object->data.vorbis_comment.comments[i].length;
}
break;
default:
FLAC__ASSERT(0);
}
}
#endif
/*@@@@ Allow setting pointer to 0 to free, or let length be 0 also. fix everywhere */
FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetaData *object, FLAC__byte *data, unsigned length, FLAC__bool copy)
{
@ -2042,6 +2040,8 @@ FLAC__bool rewrite_whole_file_(FLAC__MetaData_SimpleIterator *iterator, FLAC__St
char *tempfilename;
long fixup_is_last_flag_offset;
FLAC__ASSERT(0 != block || append == false);
if(!simple_iterator_copy_file_prefix_(iterator, &tempfile, &tempfilename, append))
return false;
@ -2064,6 +2064,9 @@ FLAC__bool rewrite_whole_file_(FLAC__MetaData_SimpleIterator *iterator, FLAC__St
if(!simple_iterator_copy_file_postfix_(iterator, &tempfile, &tempfilename, fixup_is_last_flag_offset, block==0))
return false;
if(append)
return FLAC__metadata_simple_iterator_next(iterator);
return true;
}
@ -2243,7 +2246,7 @@ FLAC__bool simple_iterator_copy_file_postfix_(FLAC__MetaData_SimpleIterator *ite
if(fixup_is_last_flag_offset >= 0) {
/* this means a block was appended to the end so we have to clear the is_last flag of the previous block */
/*@@@ MAGIC NUMBERs here; we know the is_last flag is the hit bit of the byte at this location */
/*@@@ MAGIC NUMBERs here; we know the is_last flag is the high bit of the byte at this location */
FLAC__byte x;
if(0 != fseek(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) {
cleanup_tempfile_(tempfile, tempfilename);
@ -2363,7 +2366,7 @@ FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix
strcat(*tempfilename, tempfile_suffix);
}
if(0 == (*tempfile = fopen(*tempfilename, "wb"))) {
if(0 == (*tempfile = fopen(*tempfilename, "w+b"))) {
*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
return false;
}