void remove_tag(const char* file_name) { FILE* file; FILE* temp_file; ID3v2_header* tag_header; file = fopen(file_name, "r+b"); temp_file = tmpfile(); tag_header = get_tag_header(file_name); if(tag_header == NULL) { return; } fseek(file, tag_header->tag_size + 10, SEEK_SET); int c; while((c = getc(file)) != EOF) { putc(c, temp_file); } // Write temp file data back to original file fseek(temp_file, 0, SEEK_SET); fseek(file, 0, SEEK_SET); while((c = getc(temp_file)) != EOF) { putc(c, file); } }
ID3v2_tag* load_tag(const char* file_name) { // Declaration FILE* file; ID3v2_tag* tag; ID3v2_frame_list* frame_list; ID3v2_header* tag_header; // Initialization tag = new_tag(); tag_header = get_tag_header(file_name); if(tag_header == NULL || get_tag_version(tag_header) == NO_COMPATIBLE_TAG) { // No compatible ID3 tag in the file, or we got some problem opening the file free_tag(tag); return NULL; } // Associations tag->tag_header = tag_header; file = fopen(file_name, "rb"); if(file == NULL) { perror("Error opening file"); free_tag(tag); return NULL; } tag->raw = (char*) malloc(tag->tag_header->tag_size * sizeof(char)); fseek(file, 10, SEEK_SET); fread(tag->raw, tag->tag_header->tag_size, 1, file); fclose(file); int offset = 0; while(offset < tag->tag_header->tag_size) { ID3v2_frame* frame; frame = parse_frame(tag->raw, offset, get_tag_version(tag_header)); if(frame != NULL) { offset += frame->size + 10; add_to_list(tag->frames, frame); } else { break; } } return tag; }