aboutsummaryrefslogtreecommitdiff
path: root/src/frametab.gperf
diff options
context:
space:
mode:
Diffstat (limited to 'src/frametab.gperf')
-rw-r--r--src/frametab.gperf111
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

Return to:

Send suggestions and report system problems to the System administrator.