diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2017-01-30 22:35:35 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2017-01-30 22:35:35 +0200 |
commit | 6494fe85e087bad327859dd3103133569ac2ec5b (patch) | |
tree | 8daa2bef423a0b62e67fdaf3a177647d796acd7e /src/idop.c | |
parent | cb959f75e36fbc08105fdc311fddd50516c5f1d8 (diff) | |
download | idest-6494fe85e087bad327859dd3103133569ac2ec5b.tar.gz idest-6494fe85e087bad327859dd3103133569ac2ec5b.tar.bz2 |
Apply --broken-8bit-charset only to frames in 8-bit encoding.
* src/frametab.gperf (decode_qv): Passe frame as the 2nd argument
to field_to_string.
(text_decode): Likewise.
* src/idest.h (idest_ucs4_cvt): Remove.
(field_to_string): Change the type of the 2nd argument.
* src/idop.c (frame_encoding_is_8bit)
(frame_is_genre): New auxiliary functions.
(idest_ucs4_cvt): Take frame as the 2nd argument. Do recoding
only if the frame's encoding in 8-bit.
(add_stringlist): Take frame instead of the isgenre boolean; pass
it to idest_ucs4_cvt. All uses changed.
(field_to_string): Take frame as the 2nd argument. All uses changed.
(fixup_charset): Merge with collect_text_frames.
Diffstat (limited to 'src/idop.c')
-rw-r--r-- | src/idop.c | 59 |
1 files changed, 40 insertions, 19 deletions
@@ -190,6 +190,27 @@ safe_id3_file_update_and_close(struct id3_file *file) +static int +frame_encoding_is_8bit(struct id3_frame const *frame) +{ + union id3_field const *field; + + if (!frame) + return 0; + field = id3_frame_field(frame, 0); + if (!field) + return 0; + return id3_field_gettextencoding(field) == ID3_FIELD_TEXTENCODING_ISO_8859_1; +} + +static int +frame_is_genre(struct id3_frame const *frame) +{ + if (!frame) + return 0; + return strcmp(frame->id, ID3_FRAME_GENRE) == 0; +} + char * -idest_ucs4_cvt(id3_ucs4_t const *ucs4) +idest_ucs4_cvt(id3_ucs4_t const *ucs4, struct id3_frame const *frame) { - if (broken_8bit_charset) { + if (broken_8bit_charset && frame_encoding_is_8bit(frame)) { char *tempval = (char*)id3_ucs4_latin1duplicate(ucs4); @@ -207,3 +228,4 @@ idest_ucs4_cvt(id3_ucs4_t const *ucs4) static void -add_stringlist(gl_list_t list, union id3_field *field, int isgenre, +add_stringlist(gl_list_t list, union id3_field *field, + struct id3_frame const *frame, size_t *psize) @@ -220,5 +242,5 @@ add_stringlist(gl_list_t list, union id3_field *field, int isgenre, continue; - if (isgenre) + if (frame_is_genre(frame)) ucs4 = id3_genre_name(ucs4); - str = idest_ucs4_cvt(ucs4); + str = idest_ucs4_cvt(ucs4, frame); size += strlen(str); @@ -286,3 +308,3 @@ field_binary_from_string(union id3_field *field, const char *str) char * -field_to_string(union id3_field *field, int isgenre) +field_to_string(union id3_field *field, struct id3_frame const *frame) { @@ -314,4 +336,4 @@ field_to_string(union id3_field *field, int isgenre) ucs4 = id3_field_getstring(field);; - if (ucs4) - ret = idest_ucs4_cvt(ucs4); + if (ucs4) + ret = idest_ucs4_cvt(ucs4, frame); break; @@ -320,3 +342,3 @@ field_to_string(union id3_field *field, int isgenre) ucs4 = id3_field_getfullstring(field); - ret = idest_ucs4_cvt(ucs4); + ret = idest_ucs4_cvt(ucs4, frame); break; @@ -330,3 +352,3 @@ field_to_string(union id3_field *field, int isgenre) list = new_string_list(true); - add_stringlist(list, field, isgenre, &sz); + add_stringlist(list, field, frame, &sz); ret = xmalloc(sz + 1); @@ -530,3 +552,3 @@ update_frames(struct id3_tag *tag) static void -collect_text_frames(struct id3_tag *tag) +fixup_charset(struct id3_tag *tag) { @@ -535,2 +557,5 @@ collect_text_frames(struct id3_tag *tag) + if (!broken_8bit_charset) + return; + for (i = 0; (frame = id3_tag_findframe(tag, NULL, i)); i++) { @@ -539,2 +564,3 @@ collect_text_frames(struct id3_tag *tag) idest_frame_lookup(frame->id); + if (!ft) { @@ -547,2 +573,5 @@ collect_text_frames(struct id3_tag *tag) + if (!frame_encoding_is_8bit(frame)) + continue; + ed_item_zero(&itm); @@ -562,10 +591,2 @@ collect_text_frames(struct id3_tag *tag) -static void -fixup_charset(struct id3_tag *tag) -{ - if (!broken_8bit_charset) - return; - collect_text_frames(tag); -} - void |