diff options
Diffstat (limited to 'libid3tag/compat.gperf')
-rw-r--r-- | libid3tag/compat.gperf | 282 |
1 files changed, 142 insertions, 140 deletions
diff --git a/libid3tag/compat.gperf b/libid3tag/compat.gperf index 4e24613..6fa1d4e 100644 --- a/libid3tag/compat.gperf +++ b/libid3tag/compat.gperf @@ -133,165 +133,167 @@ WPB, EQ(WPUB) /* Publishers official webpage */ WXX, EQ(WXXX) /* User defined URL link frame */ %% -static -int translate_TCON(struct id3_frame *frame, char const *oldid, - id3_byte_t const *data, id3_length_t length) +static int +translate_TCON(struct id3_frame *frame, char const *oldid, + id3_byte_t const *data, id3_length_t length) { - id3_byte_t const *end; - enum id3_field_textencoding encoding; - id3_ucs4_t *string = 0, *ptr, *endptr; - int result = 0; + id3_byte_t const *end; + enum id3_field_textencoding encoding; + id3_ucs4_t *string = 0, *ptr, *endptr; + int result = 0; - /* translate old TCON syntax into multiple strings */ + /* translate old TCON syntax into multiple strings */ - assert(frame->nfields == 2); + assert(frame->nfields == 2); - encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1; + encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1; - end = data + length; + end = data + length; - if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding) == -1) - goto fail; + if (id3_field_parse(&frame->fields[0], &data, + end - data, &encoding) == -1) + goto fail; - string = id3_parse_string(&data, end - data, encoding, 0); - if (string == 0) - goto fail; + string = id3_parse_string(&data, end - data, encoding, 0); + if (string == 0) + goto fail; - ptr = string; - while (*ptr == '(') { - if (*++ptr == '(') - break; + ptr = string; + while (*ptr == '(') { + if (*++ptr == '(') + break; + + endptr = ptr; + while (*endptr && *endptr != ')') + ++endptr; - endptr = ptr; - while (*endptr && *endptr != ')') - ++endptr; + if (*endptr) + *endptr++ = 0; - if (*endptr) - *endptr++ = 0; + if (id3_field_addstring(&frame->fields[1], ptr) == -1) + goto fail; + + ptr = endptr; + } + + if (*ptr && id3_field_addstring(&frame->fields[1], ptr) == -1) + goto fail; - if (id3_field_addstring(&frame->fields[1], ptr) == -1) - goto fail; + if (0) { + fail: + result = -1; + } - ptr = endptr; - } + if (string) + free(string); - if (*ptr && id3_field_addstring(&frame->fields[1], ptr) == -1) - goto fail; - - if (0) { - fail: - result = -1; - } - - if (string) - free(string); - - return result; + return result; } /* * NAME: compat->fixup() * DESCRIPTION: finish compatibility translations */ -int id3_compat_fixup(struct id3_tag *tag) +int +id3_compat_fixup(struct id3_tag *tag) { - struct id3_frame *frame; - unsigned int index; - id3_ucs4_t timestamp[17] = { 0 }; - int result = 0; - - /* create a TDRC frame from obsolete TYER/TDAT/TIME frames */ - - /* - * TYE/TYER: YYYY - * TDA/TDAT: DDMM - * TIM/TIME: HHMM - * - * TDRC: yyyy-MM-ddTHH:mm - */ - - index = 0; - while ((frame = id3_tag_findframe(tag, ID3_FRAME_OBSOLETE, index++))) { - char const *id; - id3_byte_t const *data, *end; - id3_length_t length; - enum id3_field_textencoding encoding; - id3_ucs4_t *string; - - id = id3_field_getframeid(&frame->fields[0]); - assert(id); - - if (strcmp(id, "TYER") != 0 && strcmp(id, "YTYE") != 0 && - strcmp(id, "TDAT") != 0 && strcmp(id, "YTDA") != 0 && - strcmp(id, "TIME") != 0 && strcmp(id, "YTIM") != 0) - continue; - - data = id3_field_getbinarydata(&frame->fields[1], &length); - assert(data); - - if (length < 1) - continue; - - end = data + length; - - encoding = id3_parse_uint(&data, 1); - string = id3_parse_string(&data, end - data, encoding, 0); - - if (id3_ucs4_length(string) < 4) { - free(string); - continue; - } - - if (strcmp(id, "TYER") == 0 || - strcmp(id, "YTYE") == 0) { - timestamp[0] = string[0]; - timestamp[1] = string[1]; - timestamp[2] = string[2]; - timestamp[3] = string[3]; - } - else if (strcmp(id, "TDAT") == 0 || - strcmp(id, "YTDA") == 0) { - timestamp[4] = '-'; - timestamp[5] = string[2]; - timestamp[6] = string[3]; - timestamp[7] = '-'; - timestamp[8] = string[0]; - timestamp[9] = string[1]; - } - else { /* TIME or YTIM */ - timestamp[10] = 'T'; - timestamp[11] = string[0]; - timestamp[12] = string[1]; - timestamp[13] = ':'; - timestamp[14] = string[2]; - timestamp[15] = string[3]; - } - - free(string); - } - - if (timestamp[0]) { - id3_ucs4_t *strings; - - frame = id3_frame_new("TDRC"); - if (frame == 0) - goto fail; - - strings = timestamp; - - if (id3_field_settextencoding(&frame->fields[0], + struct id3_frame *frame; + unsigned int index; + id3_ucs4_t timestamp[17] = { 0 }; + int result = 0; + + /* create a TDRC frame from obsolete TYER/TDAT/TIME frames */ + + /* + * TYE/TYER: YYYY + * TDA/TDAT: DDMM + * TIM/TIME: HHMM + * + * TDRC: yyyy-MM-ddTHH:mm + */ + + index = 0; + while ((frame = id3_tag_findframe(tag, ID3_FRAME_OBSOLETE, + index++))) { + char const *id; + id3_byte_t const *data, *end; + id3_length_t length; + enum id3_field_textencoding encoding; + id3_ucs4_t *string; + + id = id3_field_getframeid(&frame->fields[0]); + assert(id); + + if (strcmp(id, "TYER") != 0 && strcmp(id, "YTYE") != 0 && + strcmp(id, "TDAT") != 0 && strcmp(id, "YTDA") != 0 && + strcmp(id, "TIME") != 0 && strcmp(id, "YTIM") != 0) + continue; + + data = id3_field_getbinarydata(&frame->fields[1], &length); + assert(data); + + if (length < 1) + continue; + + end = data + length; + + encoding = id3_parse_uint(&data, 1); + string = id3_parse_string(&data, end - data, encoding, 0); + + if (id3_ucs4_length(string) < 4) { + free(string); + continue; + } + + if (strcmp(id, "TYER") == 0 || + strcmp(id, "YTYE") == 0) { + timestamp[0] = string[0]; + timestamp[1] = string[1]; + timestamp[2] = string[2]; + timestamp[3] = string[3]; + } else if (strcmp(id, "TDAT") == 0 || + strcmp(id, "YTDA") == 0) { + timestamp[4] = '-'; + timestamp[5] = string[2]; + timestamp[6] = string[3]; + timestamp[7] = '-'; + timestamp[8] = string[0]; + timestamp[9] = string[1]; + } else { /* TIME or YTIM */ + timestamp[10] = 'T'; + timestamp[11] = string[0]; + timestamp[12] = string[1]; + timestamp[13] = ':'; + timestamp[14] = string[2]; + timestamp[15] = string[3]; + } + + free(string); + } + + if (timestamp[0]) { + id3_ucs4_t *strings; + + frame = id3_frame_new("TDRC"); + if (frame == 0) + goto fail; + + strings = timestamp; + + if (id3_field_settextencoding(&frame->fields[0], ID3_FIELD_TEXTENCODING_ISO_8859_1) == -1 || - id3_field_setstrings(&frame->fields[1], 1, &strings) == -1 || - id3_tag_attachframe(tag, frame) == -1) { - id3_frame_delete(frame); - goto fail; - } - } - - if (0) { - fail: - result = -1; - } - - return result; + id3_field_setstrings(&frame->fields[1], 1, + &strings) == -1 || + id3_tag_attachframe(tag, frame) == -1) { + id3_frame_delete(frame); + goto fail; + } + } + + if (0) { + fail: + result = -1; + } + + return result; } |