diff options
Diffstat (limited to 'src/frametab.gperf')
-rw-r--r-- | src/frametab.gperf | 111 |
1 files changed, 109 insertions, 2 deletions
diff --git a/src/frametab.gperf b/src/frametab.gperf index e716954..80d60f9 100644 --- a/src/frametab.gperf +++ b/src/frametab.gperf @@ -2,3 +2,3 @@ /* This file is part of Idest. - Copyright (C) 2009-2011 Sergey Poznyakoff + Copyright (C) 2009-2011, 2015 Sergey Poznyakoff @@ -88,3 +88,3 @@ frame_field_from_string(struct id3_frame *frame, int n, const char *value) return IDEST_ERR_NOFIELD; - if (frametype->fields[n] == ID3_FIELD_TYPE_TEXTENCODING) { + if (type == ID3_FIELD_TYPE_TEXTENCODING) { /* Special case */ @@ -188,2 +188,109 @@ frame_field_from_string(struct id3_frame *frame, int n, const char *value) +int +frame_field_from_rawdata(struct id3_frame *frame, int n, + enum id3_field_type type, + const char *value) +{ + int rc = 0, res = 0; + union id3_field *field; + id3_ucs4_t *ucs4; + + field = id3_frame_field(frame, n); + if (!field) + return IDEST_ERR_NOFIELD; + if (type == ID3_FIELD_TYPE_TEXTENCODING) { + /* Special case */ + if (id3_field_settextencoding(field, + latin1_option ? + ID3_FIELD_TEXTENCODING_ISO_8859_1 + : ID3_FIELD_TEXTENCODING_UTF_8)) + rc = IDEST_ERR_SET; + return rc; + } + + switch (type) { + case ID3_FIELD_TYPE_INT8: + case ID3_FIELD_TYPE_INT16: + case ID3_FIELD_TYPE_INT24: + case ID3_FIELD_TYPE_INT32: { + char *p; + signed long number = strtoul(value, &p, 10); + if (*p) + rc = IDEST_ERR_BADCONV; + else + res = id3_field_setint(field, number); + break; + } + + case ID3_FIELD_TYPE_LATIN1: + case ID3_FIELD_TYPE_LATIN1FULL: + /* FIXME: Recode */ + res = id3_field_setlatin1(field, (id3_latin1_t const *)value); + break; + + case ID3_FIELD_TYPE_LATIN1LIST: + /* FIXME */ + rc = IDEST_ERR_NOTSUPP; + break; + + case ID3_FIELD_TYPE_STRING: + if (latin1_option) + ucs4 = id3_latin1_ucs4duplicate( + (const id3_latin1_t *)value); + else + ucs4 = id3_utf8_ucs4duplicate( + (const id3_utf8_t *)value); + res = id3_field_setstring(field, ucs4); + free(ucs4); + break; + + case ID3_FIELD_TYPE_STRINGFULL: + if (latin1_option) + ucs4 = id3_latin1_ucs4duplicate( + (const id3_latin1_t *)value); + else + ucs4 = id3_utf8_ucs4duplicate( + (const id3_utf8_t *)value); + res = id3_field_setfullstring(field, ucs4); + free(ucs4); + break; + + case ID3_FIELD_TYPE_STRINGLIST: + if (latin1_option) + ucs4 = id3_latin1_ucs4duplicate( + (const id3_latin1_t *)value); + else + ucs4 = id3_utf8_ucs4duplicate( + (const id3_utf8_t *)value); + res = id3_field_setstrings(field, 1, &ucs4); + free(ucs4); + break; + + case ID3_FIELD_TYPE_LANGUAGE: + res = id3_field_setlanguage(field, value); + break; + + case ID3_FIELD_TYPE_FRAMEID: + res = id3_field_setframeid(field, value); + break; + + case ID3_FIELD_TYPE_DATE: + /* FIXME: Convert and copy 8 bytes into + field->immediate.value */ + rc = IDEST_ERR_NOTSUPP; + break; + + case ID3_FIELD_TYPE_INT32PLUS: + case ID3_FIELD_TYPE_BINARYDATA: + rc = field_binary_from_string(field, value); + break; + + default: + rc = IDEST_ERR_BADTYPE; + } + if (rc == 0 && res) + rc = IDEST_ERR_SET; + return rc; +} + static int |