📄 metadata_object.c
字号:
free(vc->comments[comment_num].entry); /* move all comments > comment_num backward one space */ memmove(&vc->comments[comment_num], &vc->comments[comment_num+1], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-comment_num-1)); vc->comments[vc->num_comments-1].length = 0; vc->comments[vc->num_comments-1].entry = 0; return FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments-1);}FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value){ FLAC__ASSERT(0 != entry); FLAC__ASSERT(0 != field_name); FLAC__ASSERT(0 != field_value); if(!FLAC__format_vorbiscomment_entry_name_is_legal(field_name)) return false; if(!FLAC__format_vorbiscomment_entry_value_is_legal(field_value, (unsigned)(-1))) return false; { const size_t nn = strlen(field_name); const size_t nv = strlen(field_value); entry->length = nn + 1 /*=*/ + nv; if(0 == (entry->entry = (FLAC__byte*)malloc(entry->length+1))) return false; memcpy(entry->entry, field_name, nn); entry->entry[nn] = '='; memcpy(entry->entry+nn+1, field_value, nv); entry->entry[entry->length] = '\0'; } return true;}FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value){ FLAC__ASSERT(0 != entry.entry && entry.length > 0); FLAC__ASSERT(0 != field_name); FLAC__ASSERT(0 != field_value); if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) return false; { const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); const size_t nn = eq-entry.entry; const size_t nv = entry.length-nn-1; /* -1 for the '=' */ FLAC__ASSERT(0 != eq); if(0 == eq) return false; /* double protection */ if(0 == (*field_name = (char*)malloc(nn+1))) return false; if(0 == (*field_value = (char*)malloc(nv+1))) { free(*field_name); return false; } memcpy(*field_name, entry.entry, nn); memcpy(*field_value, entry.entry+nn+1, nv); (*field_name)[nn] = '\0'; (*field_value)[nv] = '\0'; } return true;}FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length){ FLAC__ASSERT(0 != entry.entry && entry.length > 0); { const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length);#if defined _MSC_VER || defined __MINGW32__#define FLAC__STRNCASECMP _strnicmp#elif defined __palmos__#define FLAC__STRNCASECMP tcsnicmp#else#define FLAC__STRNCASECMP strncasecmp#endif return (0 != eq && (unsigned)(eq-entry.entry) == field_name_length && 0 == FLAC__STRNCASECMP(field_name, (const char *)entry.entry, field_name_length));#undef FLAC__STRNCASECMP }}FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name){ FLAC__ASSERT(0 != field_name); return vorbiscomment_find_entry_from_(object, offset, field_name, strlen(field_name));}FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name){ const unsigned field_name_length = strlen(field_name); unsigned i; FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); for(i = 0; i < object->data.vorbis_comment.num_comments; i++) { if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, i)) return -1; else return 1; } } return 0;}FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name){ FLAC__bool ok = true; unsigned matching = 0; const unsigned field_name_length = strlen(field_name); int i; FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); /* must delete from end to start otherwise it will interfere with our iteration */ for(i = (int)object->data.vorbis_comment.num_comments - 1; ok && i >= 0; i--) { if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { matching++; ok &= FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i); } } return ok? (int)matching : -1;}FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(){ return (FLAC__StreamMetadata_CueSheet_Track*)calloc(1, sizeof(FLAC__StreamMetadata_CueSheet_Track));}FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object){ FLAC__StreamMetadata_CueSheet_Track *to; FLAC__ASSERT(0 != object); if(0 != (to = FLAC__metadata_object_cuesheet_track_new())) { if(!copy_track_(to, object)) { FLAC__metadata_object_cuesheet_track_delete(to); return 0; } } return to;}void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object){ FLAC__ASSERT(0 != object); if(0 != object->indices) { FLAC__ASSERT(object->num_indices > 0); free(object->indices); }}FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object){ FLAC__metadata_object_cuesheet_track_delete_data(object); free(object);}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices){ FLAC__StreamMetadata_CueSheet_Track *track; FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); track = &object->data.cue_sheet.tracks[track_num]; if(0 == track->indices) { FLAC__ASSERT(track->num_indices == 0); if(0 == new_num_indices) return true; else if(0 == (track->indices = cuesheet_track_index_array_new_(new_num_indices))) return false; } else { const unsigned old_size = track->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); const unsigned new_size = new_num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); FLAC__ASSERT(track->num_indices > 0); if(new_size == 0) { free(track->indices); track->indices = 0; } else if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*)realloc(track->indices, new_size))) return false; /* if growing, zero all the lengths/pointers of new elements */ if(new_size > old_size) memset(track->indices + track->num_indices, 0, new_size - old_size); } track->num_indices = new_num_indices; cuesheet_calculate_length_(object); return true;}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index){ FLAC__StreamMetadata_CueSheet_Track *track; FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); FLAC__ASSERT(index_num <= object->data.cue_sheet.tracks[track_num].num_indices); track = &object->data.cue_sheet.tracks[track_num]; if(!FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices+1)) return false; /* move all indices >= index_num forward one space */ memmove(&track->indices[index_num+1], &track->indices[index_num], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-1-index_num)); track->indices[index_num] = index; cuesheet_calculate_length_(object); return true;}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num){ FLAC__StreamMetadata_CueSheet_Index index; memset(&index, 0, sizeof(index)); return FLAC__metadata_object_cuesheet_track_insert_index(object, track_num, index_num, index);}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num){ FLAC__StreamMetadata_CueSheet_Track *track; FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); FLAC__ASSERT(index_num < object->data.cue_sheet.tracks[track_num].num_indices); track = &object->data.cue_sheet.tracks[track_num]; /* move all indices > index_num backward one space */ memmove(&track->indices[index_num], &track->indices[index_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-index_num-1)); FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices-1); cuesheet_calculate_length_(object); return true;}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks){ FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); if(0 == object->data.cue_sheet.tracks) { FLAC__ASSERT(object->data.cue_sheet.num_tracks == 0); if(0 == new_num_tracks) return true; else if(0 == (object->data.cue_sheet.tracks = cuesheet_track_array_new_(new_num_tracks))) return false; } else { const unsigned old_size = object->data.cue_sheet.num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); const unsigned new_size = new_num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0); /* if shrinking, free the truncated entries */ if(new_num_tracks < object->data.cue_sheet.num_tracks) { unsigned i; for(i = new_num_tracks; i < object->data.cue_sheet.num_tracks; i++) if(0 != object->data.cue_sheet.tracks[i].indices) free(object->data.cue_sheet.tracks[i].indices); } if(new_size == 0) { free(object->data.cue_sheet.tracks); object->data.cue_sheet.tracks = 0; } else if(0 == (object->data.cue_sheet.tracks = (FLAC__StreamMetadata_CueSheet_Track*)realloc(object->data.cue_sheet.tracks, new_size))) return false; /* if growing, zero all the lengths/pointers of new elements */ if(new_size > old_size) memset(object->data.cue_sheet.tracks + object->data.cue_sheet.num_tracks, 0, new_size - old_size); } object->data.cue_sheet.num_tracks = new_num_tracks; cuesheet_calculate_length_(object); return true;}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy){ FLAC__ASSERT(0 != object); FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); return cuesheet_set_track_(object, object->data.cue_sheet.tracks + track_num, track, copy);}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy){ FLAC__StreamMetadata_CueSheet *cs; FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); FLAC__ASSERT(track_num <= object->data.cue_sheet.num_tracks); cs = &object->data.cue_sheet; if(!FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks+1)) return false; /* move all tracks >= track_num forward one space */ memmove(&cs->tracks[track_num+1], &cs->tracks[track_num], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-1-track_num)); cs->tracks[track_num].num_indices = 0; cs->tracks[track_num].indices = 0; return FLAC__metadata_object_cuesheet_set_track(object, track_num, track, copy);}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num){ FLAC__StreamMetadata_CueSheet_Track track; memset(&track, 0, sizeof(track)); return FLAC__metadata_object_cuesheet_insert_track(object, track_num, &track, /*copy=*/false);}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num){ FLAC__StreamMetadata_CueSheet *cs; FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); cs = &object->data.cue_sheet; /* free the track at track_num */ if(0 != cs->tracks[track_num].indices) free(cs->tracks[track_num].indices); /* move all tracks > track_num backward one space */ memmove(&cs->tracks[track_num], &cs->tracks[track_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-track_num-1)); cs->tracks[cs->num_tracks-1].num_indices = 0; cs->tracks[cs->num_tracks-1].indices = 0; return FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks-1);}FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation){ FLAC__ASSERT(0 != object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); return FLAC__format_cuesheet_is_legal(&object->data.cue_sheet, check_cd_da_subset, violation);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -