aboutsummaryrefslogtreecommitdiff
path: root/src/idop.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-07-17 13:04:31 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-07-17 13:04:31 +0300
commit98f611e8dd2c4210d2e05a01fb7d20250a082bc7 (patch)
treecc20f06361073c6034eb6dbba1d9f8663163f94c /src/idop.c
parentdca2877ad8b5bbfc1db5f8967bb8125c76c87994 (diff)
downloadidest-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.c62
1 files changed, 57 insertions, 5 deletions
diff --git a/src/idop.c b/src/idop.c
index 81e3848..4dafb25 100644
--- a/src/idop.c
+++ b/src/idop.c
@@ -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;

Return to:

Send suggestions and report system problems to the System administrator.