summaryrefslogtreecommitdiffabout
path: root/src/idop.c
authorSergey Poznyakoff <gray@gnu.org>2017-01-30 20:35:35 (GMT)
committer Sergey Poznyakoff <gray@gnu.org>2017-01-30 20:35:35 (GMT)
commit6494fe85e087bad327859dd3103133569ac2ec5b (patch) (side-by-side diff)
tree8daa2bef423a0b62e67fdaf3a177647d796acd7e /src/idop.c
parentcb959f75e36fbc08105fdc311fddd50516c5f1d8 (diff)
downloadidest-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') (more/less context) (ignore whitespace changes)
-rw-r--r--src/idop.c59
1 files changed, 40 insertions, 19 deletions
diff --git a/src/idop.c b/src/idop.c
index 063ff78..c3a3ce2 100644
--- a/src/idop.c
+++ b/src/idop.c
@@ -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

Return to:

Send suggestions and report system problems to the System administrator.