diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-07-17 13:04:31 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-07-17 13:04:31 +0300 |
commit | 98f611e8dd2c4210d2e05a01fb7d20250a082bc7 (patch) | |
tree | cc20f06361073c6034eb6dbba1d9f8663163f94c /src/idop.c | |
parent | dca2877ad8b5bbfc1db5f8967bb8125c76c87994 (diff) | |
download | idest-98f611e8dd2c4210d2e05a01fb7d20250a082bc7.tar.gz idest-98f611e8dd2c4210d2e05a01fb7d20250a082bc7.tar.bz2 |
Handle unsupported frames in Scheme code graciously.
* src/frametab.gperf (encode_field): Rename to frame_field_from_string.
Handle ID3_FIELD_TYPE_INT32PLUS and ID3_FIELD_TYPE_BINARYDATA.
* src/guile.c (idest_rawdata): New global symbol.
(frame_to_scm): Handle frames for which no frametab is defined.
(scm_to_tag): Handle frames in raw format.
* src/idest.h (field_binary_from_string)
(field_binary_to_string)
(frame_field_from_string): New protos.
* src/idop.c (field_binary_to_string): New function.
(field_binary_from_string): New function.
(field_to_string): Handle ID3_FIELD_TYPE_INT32PLUS and
ID3_FIELD_TYPE_BINARYDATA.
Diffstat (limited to 'src/idop.c')
-rw-r--r-- | src/idop.c | 62 |
1 files changed, 57 insertions, 5 deletions
@@ -185,6 +185,61 @@ add_stringlist(gl_list_t list, union id3_field *field, int isgenre, } char * +field_binary_to_string(union id3_field *field) +{ + size_t size = field->binary.length * 2 + 1; + char *ret, *p; + size_t i; + + ret = xmalloc(size); + for (i = 0, p = ret; i < field->binary.length; i++, p += 2) + sprintf(p, "%02X", field->binary.data[i]); + *p = 0; + return ret; +} + +int +field_binary_from_string(union id3_field *field, const char *str) +{ + char xdig[] = "0123456789ABCDEF"; + size_t len, i; + + if (field->type != ID3_FIELD_TYPE_BINARYDATA) + return IDEST_ERR_BADTYPE; + len = strlen(str); + if (len % 2) + return IDEST_ERR_BADCONV; + len /= 2; + field->binary.length = len; + field->binary.data = xmalloc(len); + for (i = 0; i < len; i++) { + unsigned char b; + char *p; + + p = strchr(xdig, *str++); + if (!p) { + free(field->binary.data); + field->binary.length = 0; + field->binary.data = NULL; + return IDEST_ERR_BADCONV; + } + b = (p - xdig) << 4; + + p = strchr(xdig, *str++); + if (!p) { + free(field->binary.data); + field->binary.length = 0; + field->binary.data = NULL; + return IDEST_ERR_BADCONV; + } + b |= p - xdig; + + field->binary.data[i] = b; + } + return IDEST_OK; +} + +char * field_to_string(union id3_field *field, int isgenre) { id3_ucs4_t const *ucs4; @@ -246,12 +301,9 @@ field_to_string(union id3_field *field, int isgenre) ret = xstrdup(field->immediate.value); break; - case ID3_FIELD_TYPE_BINARYDATA: - /* FIXME */ - break; - case ID3_FIELD_TYPE_INT32PLUS: - /* FIXME */ + case ID3_FIELD_TYPE_BINARYDATA: + ret = field_binary_to_string(field); break; } return ret; |