diff options
Diffstat (limited to 'libid3tag/field.c')
-rw-r--r-- | libid3tag/field.c | 1333 |
1 files changed, 695 insertions, 638 deletions
diff --git a/libid3tag/field.c b/libid3tag/field.c index f2ecc0f..b334b0c 100644 --- a/libid3tag/field.c +++ b/libid3tag/field.c @@ -19,872 +19,929 @@ * $Id: field.c,v 1.16 2004/01/23 09:41:32 rob Exp $ */ -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif -# include "global.h" +#include "global.h" -# include <stdlib.h> -# include <string.h> +#include <stdlib.h> +#include <string.h> -# ifdef HAVE_ASSERT_H -# include <assert.h> -# endif +#ifdef HAVE_ASSERT_H +# include <assert.h> +#endif -# include "id3tag.h" -# include "field.h" -# include "frame.h" -# include "render.h" -# include "ucs4.h" -# include "latin1.h" -# include "parse.h" +#include "id3tag.h" +#include "field.h" +#include "frame.h" +#include "render.h" +#include "ucs4.h" +#include "latin1.h" +#include "parse.h" /* - * NAME: field->init() - * DESCRIPTION: initialize a field to a default value for the given type + * NAME: field->init() + * DESCRIPTION: initialize a field to a default value for the given type */ -void id3_field_init(union id3_field *field, enum id3_field_type type) +void +id3_field_init(union id3_field *field, enum id3_field_type type) { - assert(field); - - switch (field->type = type) { - case ID3_FIELD_TYPE_TEXTENCODING: - case ID3_FIELD_TYPE_INT8: - case ID3_FIELD_TYPE_INT16: - case ID3_FIELD_TYPE_INT24: - case ID3_FIELD_TYPE_INT32: - field->number.value = 0; - break; - - case ID3_FIELD_TYPE_LATIN1: - case ID3_FIELD_TYPE_LATIN1FULL: - field->latin1.ptr = 0; - break; - - case ID3_FIELD_TYPE_LATIN1LIST: - field->latin1list.nstrings = 0; - field->latin1list.strings = 0; - - case ID3_FIELD_TYPE_STRING: - case ID3_FIELD_TYPE_STRINGFULL: - field->string.ptr = 0; - break; - - case ID3_FIELD_TYPE_STRINGLIST: - field->stringlist.nstrings = 0; - field->stringlist.strings = 0; - break; - - case ID3_FIELD_TYPE_LANGUAGE: - strcpy(field->immediate.value, "XXX"); - break; - - case ID3_FIELD_TYPE_FRAMEID: - strcpy(field->immediate.value, "XXXX"); - break; - - case ID3_FIELD_TYPE_DATE: - memset(field->immediate.value, 0, sizeof(field->immediate.value)); - break; - - case ID3_FIELD_TYPE_INT32PLUS: - case ID3_FIELD_TYPE_BINARYDATA: - field->binary.data = 0; - field->binary.length = 0; - break; - } + assert(field); + + switch (field->type = type) { + case ID3_FIELD_TYPE_TEXTENCODING: + case ID3_FIELD_TYPE_INT8: + case ID3_FIELD_TYPE_INT16: + case ID3_FIELD_TYPE_INT24: + case ID3_FIELD_TYPE_INT32: + field->number.value = 0; + break; + + case ID3_FIELD_TYPE_LATIN1: + case ID3_FIELD_TYPE_LATIN1FULL: + field->latin1.ptr = 0; + break; + + case ID3_FIELD_TYPE_LATIN1LIST: + field->latin1list.nstrings = 0; + field->latin1list.strings = 0; + + case ID3_FIELD_TYPE_STRING: + case ID3_FIELD_TYPE_STRINGFULL: + field->string.ptr = 0; + break; + + case ID3_FIELD_TYPE_STRINGLIST: + field->stringlist.nstrings = 0; + field->stringlist.strings = 0; + break; + + case ID3_FIELD_TYPE_LANGUAGE: + strcpy(field->immediate.value, "XXX"); + break; + + case ID3_FIELD_TYPE_FRAMEID: + strcpy(field->immediate.value, "XXXX"); + break; + + case ID3_FIELD_TYPE_DATE: + memset(field->immediate.value, 0, + sizeof(field->immediate.value)); + break; + + case ID3_FIELD_TYPE_INT32PLUS: + case ID3_FIELD_TYPE_BINARYDATA: + field->binary.data = 0; + field->binary.length = 0; + break; + } } /* - * NAME: field->finish() - * DESCRIPTION: reset a field, deallocating memory if necessary + * NAME: field->finish() + * DESCRIPTION: reset a field, deallocating memory if necessary */ -void id3_field_finish(union id3_field *field) +void +id3_field_finish(union id3_field *field) { - unsigned int i; - - assert(field); - - switch (field->type) { - case ID3_FIELD_TYPE_TEXTENCODING: - case ID3_FIELD_TYPE_INT8: - case ID3_FIELD_TYPE_INT16: - case ID3_FIELD_TYPE_INT24: - case ID3_FIELD_TYPE_INT32: - case ID3_FIELD_TYPE_LANGUAGE: - case ID3_FIELD_TYPE_FRAMEID: - case ID3_FIELD_TYPE_DATE: - break; - - case ID3_FIELD_TYPE_LATIN1: - case ID3_FIELD_TYPE_LATIN1FULL: - if (field->latin1.ptr) - free(field->latin1.ptr); - break; - - case ID3_FIELD_TYPE_LATIN1LIST: - for (i = 0; i < field->latin1list.nstrings; ++i) - free(field->latin1list.strings[i]); - - if (field->latin1list.strings) - free(field->latin1list.strings); - break; - - case ID3_FIELD_TYPE_STRING: - case ID3_FIELD_TYPE_STRINGFULL: - if (field->string.ptr) - free(field->string.ptr); - break; - - case ID3_FIELD_TYPE_STRINGLIST: - for (i = 0; i < field->stringlist.nstrings; ++i) - free(field->stringlist.strings[i]); - - if (field->stringlist.strings) - free(field->stringlist.strings); - break; - - case ID3_FIELD_TYPE_INT32PLUS: - case ID3_FIELD_TYPE_BINARYDATA: - if (field->binary.data) - free(field->binary.data); - break; - } - - id3_field_init(field, field->type); + unsigned int i; + + assert(field); + + switch (field->type) { + case ID3_FIELD_TYPE_TEXTENCODING: + case ID3_FIELD_TYPE_INT8: + case ID3_FIELD_TYPE_INT16: + case ID3_FIELD_TYPE_INT24: + case ID3_FIELD_TYPE_INT32: + case ID3_FIELD_TYPE_LANGUAGE: + case ID3_FIELD_TYPE_FRAMEID: + case ID3_FIELD_TYPE_DATE: + break; + + case ID3_FIELD_TYPE_LATIN1: + case ID3_FIELD_TYPE_LATIN1FULL: + if (field->latin1.ptr) + free(field->latin1.ptr); + break; + + case ID3_FIELD_TYPE_LATIN1LIST: + for (i = 0; i < field->latin1list.nstrings; ++i) + free(field->latin1list.strings[i]); + + if (field->latin1list.strings) + free(field->latin1list.strings); + break; + + case ID3_FIELD_TYPE_STRING: + case ID3_FIELD_TYPE_STRINGFULL: + if (field->string.ptr) + free(field->string.ptr); + break; + + case ID3_FIELD_TYPE_STRINGLIST: + for (i = 0; i < field->stringlist.nstrings; ++i) + free(field->stringlist.strings[i]); + + if (field->stringlist.strings) + free(field->stringlist.strings); + break; + + case ID3_FIELD_TYPE_INT32PLUS: + case ID3_FIELD_TYPE_BINARYDATA: + if (field->binary.data) + free(field->binary.data); + break; + } + + id3_field_init(field, field->type); } /* - * NAME: field->type() - * DESCRIPTION: return the value type of a field + * NAME: field->type() + * DESCRIPTION: return the value type of a field */ -enum id3_field_type id3_field_type(union id3_field const *field) +enum id3_field_type +id3_field_type(union id3_field const *field) { - assert(field); + assert(field); - return field->type; + return field->type; } /* - * NAME: field->parse() - * DESCRIPTION: parse a field value + * NAME: field->parse() + * DESCRIPTION: parse a field value */ -int id3_field_parse(union id3_field *field, id3_byte_t const **ptr, - id3_length_t length, enum id3_field_textencoding *encoding) +int +id3_field_parse(union id3_field *field, id3_byte_t const **ptr, + id3_length_t length, enum id3_field_textencoding *encoding) { - assert(field); - - id3_field_finish(field); - - switch (field->type) { - case ID3_FIELD_TYPE_INT32: - if (length < 4) - goto fail; - - field->number.value = id3_parse_uint(ptr, 4); - break; - - case ID3_FIELD_TYPE_INT24: - if (length < 3) - goto fail; - - field->number.value = id3_parse_uint(ptr, 3); - break; - - case ID3_FIELD_TYPE_INT16: - if (length < 2) - goto fail; - - field->number.value = id3_parse_uint(ptr, 2); - break; - - case ID3_FIELD_TYPE_INT8: - case ID3_FIELD_TYPE_TEXTENCODING: - if (length < 1) - goto fail; - - field->number.value = id3_parse_uint(ptr, 1); - - if (field->type == ID3_FIELD_TYPE_TEXTENCODING) - *encoding = field->number.value; - break; - - case ID3_FIELD_TYPE_LANGUAGE: - if (length < 3) - goto fail; - - id3_parse_immediate(ptr, 3, field->immediate.value); - break; - - case ID3_FIELD_TYPE_FRAMEID: - if (length < 4) - goto fail; - - id3_parse_immediate(ptr, 4, field->immediate.value); - break; - - case ID3_FIELD_TYPE_DATE: - if (length < 8) - goto fail; - - id3_parse_immediate(ptr, 8, field->immediate.value); - break; - - case ID3_FIELD_TYPE_LATIN1: - case ID3_FIELD_TYPE_LATIN1FULL: - { - id3_latin1_t *latin1; - - latin1 = id3_parse_latin1(ptr, length, - field->type == ID3_FIELD_TYPE_LATIN1FULL); - if (latin1 == 0) - goto fail; - - field->latin1.ptr = latin1; - } - break; - - case ID3_FIELD_TYPE_LATIN1LIST: - { - id3_byte_t const *end; - id3_latin1_t *latin1, **strings; - - end = *ptr + length; - - while (end - *ptr > 0) { - latin1 = id3_parse_latin1(ptr, end - *ptr, 0); - if (latin1 == 0) - goto fail; - - strings = realloc(field->latin1list.strings, - (field->latin1list.nstrings + 1) * sizeof(*strings)); - if (strings == 0) { - free(latin1); - goto fail; + assert(field); + + id3_field_finish(field); + + switch (field->type) { + case ID3_FIELD_TYPE_INT32: + if (length < 4) + goto fail; + + field->number.value = id3_parse_uint(ptr, 4); + break; + + case ID3_FIELD_TYPE_INT24: + if (length < 3) + goto fail; + + field->number.value = id3_parse_uint(ptr, 3); + break; + + case ID3_FIELD_TYPE_INT16: + if (length < 2) + goto fail; + + field->number.value = id3_parse_uint(ptr, 2); + break; + + case ID3_FIELD_TYPE_INT8: + case ID3_FIELD_TYPE_TEXTENCODING: + if (length < 1) + goto fail; + + field->number.value = id3_parse_uint(ptr, 1); + + if (field->type == ID3_FIELD_TYPE_TEXTENCODING) + *encoding = field->number.value; + break; + + case ID3_FIELD_TYPE_LANGUAGE: + if (length < 3) + goto fail; + + id3_parse_immediate(ptr, 3, field->immediate.value); + break; + + case ID3_FIELD_TYPE_FRAMEID: + if (length < 4) + goto fail; + + id3_parse_immediate(ptr, 4, field->immediate.value); + break; + + case ID3_FIELD_TYPE_DATE: + if (length < 8) + goto fail; + + id3_parse_immediate(ptr, 8, field->immediate.value); + break; + + case ID3_FIELD_TYPE_LATIN1: + case ID3_FIELD_TYPE_LATIN1FULL: + { + id3_latin1_t *latin1; + + latin1 = id3_parse_latin1(ptr, length, + field->type == + ID3_FIELD_TYPE_LATIN1FULL); + if (latin1 == 0) + goto fail; + + field->latin1.ptr = latin1; + } + break; + + case ID3_FIELD_TYPE_LATIN1LIST: + { + id3_byte_t const *end; + id3_latin1_t *latin1, + **strings; + + end = *ptr + length; + + while (end - *ptr > 0) { + latin1 = + id3_parse_latin1(ptr, end - *ptr, 0); + if (latin1 == 0) + goto fail; + + strings = + realloc(field->latin1list.strings, + (field->latin1list.nstrings + + 1) * sizeof(*strings)); + if (strings == 0) { + free(latin1); + goto fail; + } + + field->latin1list.strings = strings; + field->latin1list.strings + [field->latin1list.nstrings++] = latin1; + } + } + break; + + case ID3_FIELD_TYPE_STRING: + case ID3_FIELD_TYPE_STRINGFULL: + { + id3_ucs4_t *ucs4; + + ucs4 = id3_parse_string(ptr, length, *encoding, + field->type == + ID3_FIELD_TYPE_STRINGFULL); + if (ucs4 == 0) + goto fail; + + field->string.ptr = ucs4; + } + break; + + case ID3_FIELD_TYPE_STRINGLIST: + { + id3_byte_t const *end; + id3_ucs4_t *ucs4, + **strings; + + end = *ptr + length; + + while (end - *ptr > 0) { + ucs4 = + id3_parse_string(ptr, end - *ptr, + *encoding, 0); + if (ucs4 == 0) + goto fail; + + strings = + realloc(field->stringlist.strings, + (field->stringlist.nstrings + + 1) * sizeof(*strings)); + if (strings == 0) { + free(ucs4); + goto fail; + } + + field->stringlist.strings = strings; + field->stringlist.strings + [field->stringlist.nstrings++] = ucs4; + } + } + break; + + case ID3_FIELD_TYPE_INT32PLUS: + case ID3_FIELD_TYPE_BINARYDATA: + { + id3_byte_t *data; + + data = id3_parse_binary(ptr, length); + if (data == 0) + goto fail; + + field->binary.data = data; + field->binary.length = length; + } + break; } - field->latin1list.strings = strings; - field->latin1list.strings[field->latin1list.nstrings++] = latin1; - } - } - break; - - case ID3_FIELD_TYPE_STRING: - case ID3_FIELD_TYPE_STRINGFULL: - { - id3_ucs4_t *ucs4; - - ucs4 = id3_parse_string(ptr, length, *encoding, - field->type == ID3_FIELD_TYPE_STRINGFULL); - if (ucs4 == 0) - goto fail; - - field->string.ptr = ucs4; - } - break; - - case ID3_FIELD_TYPE_STRINGLIST: - { - id3_byte_t const *end; - id3_ucs4_t *ucs4, **strings; - - end = *ptr + length; + return 0; - while (end - *ptr > 0) { - ucs4 = id3_parse_string(ptr, end - *ptr, *encoding, 0); - if (ucs4 == 0) - goto fail; - - strings = realloc(field->stringlist.strings, - (field->stringlist.nstrings + 1) * sizeof(*strings)); - if (strings == 0) { - free(ucs4); - goto fail; - } - - field->stringlist.strings = strings; - field->stringlist.strings[field->stringlist.nstrings++] = ucs4; - } - } - break; - - case ID3_FIELD_TYPE_INT32PLUS: - case ID3_FIELD_TYPE_BINARYDATA: - { - id3_byte_t *data; - - data = id3_parse_binary(ptr, length); - if (data == 0) - goto fail; - - field->binary.data = data; - field->binary.length = length; - } - break; - } - - return 0; - - fail: - return -1; + fail: + return -1; } /* - * NAME: field->render() - * DESCRIPTION: render a field value + * NAME: field->render() + * DESCRIPTION: render a field value */ -id3_length_t id3_field_render(union id3_field const *field, id3_byte_t **ptr, - enum id3_field_textencoding *encoding, - int terminate) +id3_length_t +id3_field_render(union id3_field const *field, + id3_byte_t ** ptr, + enum id3_field_textencoding * encoding, int terminate) { - id3_length_t size; - unsigned int i; - - assert(field && encoding); - - switch (field->type) { - case ID3_FIELD_TYPE_INT32: - return id3_render_int(ptr, field->number.value, 4); - - case ID3_FIELD_TYPE_INT24: - return id3_render_int(ptr, field->number.value, 3); - - case ID3_FIELD_TYPE_INT16: - return id3_render_int(ptr, field->number.value, 2); - - case ID3_FIELD_TYPE_TEXTENCODING: - *encoding = field->number.value; - case ID3_FIELD_TYPE_INT8: - return id3_render_int(ptr, field->number.value, 1); - - case ID3_FIELD_TYPE_LATIN1: - case ID3_FIELD_TYPE_LATIN1FULL: - return id3_render_latin1(ptr, field->latin1.ptr, terminate); - - case ID3_FIELD_TYPE_LATIN1LIST: - size = 0; - for (i = 0; i < field->latin1list.nstrings; ++i) { - size += id3_render_latin1(ptr, field->latin1list.strings[i], - (i < field->latin1list.nstrings - 1) || - terminate); - } - return size; - - case ID3_FIELD_TYPE_STRING: - case ID3_FIELD_TYPE_STRINGFULL: - return id3_render_string(ptr, field->string.ptr, *encoding, terminate); - - case ID3_FIELD_TYPE_STRINGLIST: - size = 0; - for (i = 0; i < field->stringlist.nstrings; ++i) { - size += id3_render_string(ptr, field->stringlist.strings[i], *encoding, - (i < field->stringlist.nstrings - 1) || - terminate); - } - return size; - - case ID3_FIELD_TYPE_LANGUAGE: - return id3_render_immediate(ptr, field->immediate.value, 3); - - case ID3_FIELD_TYPE_FRAMEID: - return id3_render_immediate(ptr, field->immediate.value, 4); - - case ID3_FIELD_TYPE_DATE: - return id3_render_immediate(ptr, field->immediate.value, 8); - - case ID3_FIELD_TYPE_INT32PLUS: - case ID3_FIELD_TYPE_BINARYDATA: - return id3_render_binary(ptr, field->binary.data, field->binary.length); - } - - return 0; + id3_length_t size; + unsigned int i; + + assert(field && encoding); + + switch (field->type) { + case ID3_FIELD_TYPE_INT32: + return id3_render_int(ptr, field->number.value, 4); + + case ID3_FIELD_TYPE_INT24: + return id3_render_int(ptr, field->number.value, 3); + + case ID3_FIELD_TYPE_INT16: + return id3_render_int(ptr, field->number.value, 2); + + case ID3_FIELD_TYPE_TEXTENCODING: + *encoding = field->number.value; + case ID3_FIELD_TYPE_INT8: + return id3_render_int(ptr, field->number.value, 1); + + case ID3_FIELD_TYPE_LATIN1: + case ID3_FIELD_TYPE_LATIN1FULL: + return id3_render_latin1(ptr, field->latin1.ptr, + terminate); + + case ID3_FIELD_TYPE_LATIN1LIST: + size = 0; + for (i = 0; i < field->latin1list.nstrings; ++i) { + size += + id3_render_latin1(ptr, + field->latin1list.strings[i], + (i < + field->latin1list.nstrings - + 1) + || terminate); + } + return size; + + case ID3_FIELD_TYPE_STRING: + case ID3_FIELD_TYPE_STRINGFULL: + return id3_render_string(ptr, field->string.ptr, *encoding, + terminate); + + case ID3_FIELD_TYPE_STRINGLIST: + size = 0; + for (i = 0; i < field->stringlist.nstrings; ++i) { + size += + id3_render_string(ptr, + field->stringlist.strings[i], + *encoding, + (i < + field->stringlist.nstrings - + 1) + || terminate); + } + return size; + + case ID3_FIELD_TYPE_LANGUAGE: + return id3_render_immediate(ptr, field->immediate.value, + 3); + + case ID3_FIELD_TYPE_FRAMEID: + return id3_render_immediate(ptr, field->immediate.value, + 4); + + case ID3_FIELD_TYPE_DATE: + return id3_render_immediate(ptr, field->immediate.value, + 8); + + case ID3_FIELD_TYPE_INT32PLUS: + case ID3_FIELD_TYPE_BINARYDATA: + return id3_render_binary(ptr, field->binary.data, + field->binary.length); + } + + return 0; } /* - * NAME: field->setint() - * DESCRIPTION: set the value of an int field + * NAME: field->setint() + * DESCRIPTION: set the value of an int field */ -int id3_field_setint(union id3_field *field, signed long number) +int +id3_field_setint(union id3_field *field, signed long number) { - assert(field); - - switch (field->type) { - case ID3_FIELD_TYPE_INT8: - if (number > 0x7f || number < -0x80) - return -1; - break; - - case ID3_FIELD_TYPE_INT16: - if (number > 0x7fff || number < -0x8000) - return -1; - break; - - case ID3_FIELD_TYPE_INT24: - if (number > 0x7fffffL || number < -0x800000L) - return -1; - break; - - case ID3_FIELD_TYPE_INT32: - if (number > 0x7fffffffL || number < -0x80000000L) - return -1; - break; - - default: - return -1; - } + assert(field); + + switch (field->type) { + case ID3_FIELD_TYPE_INT8: + if (number > 0x7f || number < -0x80) + return -1; + break; + + case ID3_FIELD_TYPE_INT16: + if (number > 0x7fff || number < -0x8000) + return -1; + break; + + case ID3_FIELD_TYPE_INT24: + if (number > 0x7fffffL || number < -0x800000L) + return -1; + break; + + case ID3_FIELD_TYPE_INT32: + if (number > 0x7fffffffL || number < -0x80000000L) + return -1; + break; + + default: + return -1; + } - id3_field_finish(field); + id3_field_finish(field); - field->number.value = number; + field->number.value = number; - return 0; + return 0; } /* - * NAME: field->settextencoding() - * DESCRIPTION: set the value of a textencoding field + * NAME: field->settextencoding() + * DESCRIPTION: set the value of a textencoding field */ -int id3_field_settextencoding(union id3_field *field, - enum id3_field_textencoding encoding) +int +id3_field_settextencoding(union id3_field *field, + enum id3_field_textencoding encoding) { - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_TEXTENCODING) - return -1; + if (field->type != ID3_FIELD_TYPE_TEXTENCODING) + return -1; - id3_field_finish(field); + id3_field_finish(field); - field->number.value = encoding; + field->number.value = encoding; - return 0; + return 0; } -static -int set_latin1(union id3_field *field, id3_latin1_t const *latin1) +static int +set_latin1(union id3_field *field, id3_latin1_t const *latin1) { - id3_latin1_t *data; - - if (latin1 == 0 || *latin1 == 0) - data = 0; - else { - data = id3_latin1_duplicate(latin1); - if (data == 0) - return -1; - } + id3_latin1_t *data; + + if (latin1 == 0 || *latin1 == 0) + data = 0; + else { + data = id3_latin1_duplicate(latin1); + if (data == 0) + return -1; + } - field->latin1.ptr = data; + field->latin1.ptr = data; - return 0; + return 0; } /* - * NAME: field->setlatin1() - * DESCRIPTION: set the value of a latin1 field + * NAME: field->setlatin1() + * DESCRIPTION: set the value of a latin1 field */ -int id3_field_setlatin1(union id3_field *field, id3_latin1_t const *latin1) +int +id3_field_setlatin1(union id3_field *field, id3_latin1_t const *latin1) { - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_LATIN1) - return -1; + if (field->type != ID3_FIELD_TYPE_LATIN1) + return -1; - id3_field_finish(field); + id3_field_finish(field); - if (latin1) { - id3_latin1_t const *ptr; + if (latin1) { + id3_latin1_t const *ptr; - for (ptr = latin1; *ptr; ++ptr) { - if (*ptr == '\n') - return -1; - } - } + for (ptr = latin1; *ptr; ++ptr) { + if (*ptr == '\n') + return -1; + } + } - return set_latin1(field, latin1); + return set_latin1(field, latin1); } /* - * NAME: field->setfulllatin1() - * DESCRIPTION: set the value of a full latin1 field + * NAME: field->setfulllatin1() + * DESCRIPTION: set the value of a full latin1 field */ -int id3_field_setfulllatin1(union id3_field *field, id3_latin1_t const *latin1) +int +id3_field_setfulllatin1(union id3_field *field, id3_latin1_t const *latin1) { - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_LATIN1FULL) - return -1; + if (field->type != ID3_FIELD_TYPE_LATIN1FULL) + return -1; - id3_field_finish(field); + id3_field_finish(field); - return set_latin1(field, latin1); + return set_latin1(field, latin1); } -static -int set_string(union id3_field *field, id3_ucs4_t const *string) +static int +set_string(union id3_field *field, id3_ucs4_t const *string) { - id3_ucs4_t *data; - - if (string == 0 || *string == 0) - data = 0; - else { - data = id3_ucs4_duplicate(string); - if (data == 0) - return -1; - } + id3_ucs4_t *data; + + if (string == 0 || *string == 0) + data = 0; + else { + data = id3_ucs4_duplicate(string); + if (data == 0) + return -1; + } - field->string.ptr = data; + field->string.ptr = data; - return 0; + return 0; } /* - * NAME: field->setstring() - * DESCRIPTION: set the value of a string field + * NAME: field->setstring() + * DESCRIPTION: set the value of a string field */ -int id3_field_setstring(union id3_field *field, id3_ucs4_t const *string) +int +id3_field_setstring(union id3_field *field, id3_ucs4_t const *string) { - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_STRING) - return -1; + if (field->type != ID3_FIELD_TYPE_STRING) + return -1; - id3_field_finish(field); + id3_field_finish(field); - if (string) { - id3_ucs4_t const *ptr; + if (string) { + id3_ucs4_t const *ptr; - for (ptr = string; *ptr; ++ptr) { - if (*ptr == '\n') - return -1; - } - } + for (ptr = string; *ptr; ++ptr) { + if (*ptr == '\n') + return -1; + } + } - return set_string(field, string); + return set_string(field, string); } /* - * NAME: field->setfullstring() - * DESCRIPTION: set the value of a full string field + * NAME: field->setfullstring() + * DESCRIPTION: set the value of a full string field */ -int id3_field_setfullstring(union id3_field *field, id3_ucs4_t const *string) +int +id3_field_setfullstring(union id3_field *field, id3_ucs4_t const *string) { - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_STRINGFULL) - return -1; + if (field->type != ID3_FIELD_TYPE_STRINGFULL) + return -1; - id3_field_finish(field); + id3_field_finish(field); - return set_string(field, string); + return set_string(field, string); } /* - * NAME: field->setstrings() - * DESCRIPTION: set the value of a stringlist field + * NAME: field->setstrings() + * DESCRIPTION: set the value of a stringlist field */ -int id3_field_setstrings(union id3_field *field, - unsigned int length, id3_ucs4_t **ptrs) +int +id3_field_setstrings(union id3_field *field, + unsigned int length, id3_ucs4_t ** ptrs) { - id3_ucs4_t **strings; - unsigned int i; + id3_ucs4_t **strings; + unsigned int i; - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_STRINGLIST) - return -1; + if (field->type != ID3_FIELD_TYPE_STRINGLIST) + return -1; - id3_field_finish(field); + id3_field_finish(field); - if (length == 0) - return 0; + if (length == 0) + return 0; - strings = malloc(length * sizeof(*strings)); - if (strings == 0) - return -1; + strings = malloc(length * sizeof(*strings)); + if (strings == 0) + return -1; - for (i = 0; i < length; ++i) { - strings[i] = id3_ucs4_duplicate(ptrs[i]); - if (strings[i] == 0) { - while (i--) - free(strings[i]); + for (i = 0; i < length; ++i) { + strings[i] = id3_ucs4_duplicate(ptrs[i]); + if (strings[i] == 0) { + while (i--) + free(strings[i]); - free(strings); - return -1; - } - } + free(strings); + return -1; + } + } - field->stringlist.strings = strings; - field->stringlist.nstrings = length; + field->stringlist.strings = strings; + field->stringlist.nstrings = length; - return 0; + return 0; } /* - * NAME: field->addstring() - * DESCRIPTION: add a string to a stringlist field + * NAME: field->addstring() + * DESCRIPTION: add a string to a stringlist field */ -int id3_field_addstring(union id3_field *field, id3_ucs4_t const *string) +int +id3_field_addstring(union id3_field *field, id3_ucs4_t const *string) { - id3_ucs4_t *new, **strings; + id3_ucs4_t *new, + **strings; - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_STRINGLIST) - return -1; + if (field->type != ID3_FIELD_TYPE_STRINGLIST) + return -1; - if (string == 0) - string = id3_ucs4_empty; + if (string == 0) + string = id3_ucs4_empty; - new = id3_ucs4_duplicate(string); - if (new == 0) - return -1; + new = id3_ucs4_duplicate(string); + if (new == 0) + return -1; - strings = realloc(field->stringlist.strings, - (field->stringlist.nstrings + 1) * sizeof(*strings)); - if (strings == 0) { - free(new); - return -1; - } + strings = realloc(field->stringlist.strings, + (field->stringlist.nstrings + + 1) * sizeof(*strings)); + if (strings == 0) { + free(new); + return -1; + } - field->stringlist.strings = strings; - field->stringlist.strings[field->stringlist.nstrings++] = new; + field->stringlist.strings = strings; + field->stringlist.strings[field->stringlist.nstrings++] = new; - return 0; + return 0; } /* - * NAME: field->setlanguage() - * DESCRIPTION: set the value of a language field + * NAME: field->setlanguage() + * DESCRIPTION: set the value of a language field */ -int id3_field_setlanguage(union id3_field *field, char const *language) +int +id3_field_setlanguage(union id3_field *field, char const *language) { - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_LANGUAGE) - return -1; + if (field->type != ID3_FIELD_TYPE_LANGUAGE) + return -1; - id3_field_finish(field); + id3_field_finish(field); - if (language) { - if (strlen(language) != 3) - return -1; + if (language) { + if (strlen(language) != 3) + return -1; - strcpy(field->immediate.value, language); - } + strcpy(field->immediate.value, language); + } - return 0; + return 0; } /* - * NAME: field->setframeid() - * DESCRIPTION: set the value of a frameid field + * NAME: field->setframeid() + * DESCRIPTION: set the value of a frameid field */ -int id3_field_setframeid(union id3_field *field, char const *id) +int +id3_field_setframeid(union id3_field *field, char const *id) { - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_FRAMEID || - !id3_frame_validid(id)) - return -1; + if (field->type != ID3_FIELD_TYPE_FRAMEID + || !id3_frame_validid(id)) + return -1; - id3_field_finish(field); + id3_field_finish(field); - field->immediate.value[0] = id[0]; - field->immediate.value[1] = id[1]; - field->immediate.value[2] = id[2]; - field->immediate.value[3] = id[3]; - field->immediate.value[4] = 0; + field->immediate.value[0] = id[0]; + field->immediate.value[1] = id[1]; + field->immediate.value[2] = id[2]; + field->immediate.value[3] = id[3]; + field->immediate.value[4] = 0; - return 0; + return 0; } /* - * NAME: field->setbinarydata() - * DESCRIPTION: set the value of a binarydata field + * NAME: field->setbinarydata() + * DESCRIPTION: set the value of a binarydata field */ -int id3_field_setbinarydata(union id3_field *field, - id3_byte_t const *data, id3_length_t length) +int +id3_field_setbinarydata(union id3_field *field, + id3_byte_t const *data, id3_length_t length) { - id3_byte_t *mem; + id3_byte_t *mem; - assert(field); + assert(field); - if (field->type != ID3_FIELD_TYPE_BINARYDATA) - return -1; + if (field->type != ID3_FIELD_TYPE_BINARYDATA) + return -1; - id3_field_finish(field); + id3_field_finish(field); - if (length == 0) - mem = 0; - else { - mem = malloc(length); - if (mem == 0) - return -1; + if (length == 0) + mem = 0; + else { + mem = malloc(length); + if (mem == 0) + return -1; - assert(data); + assert(data); - memcpy(mem, data, length); - } + memcpy(mem, data, length); + } - field->binary.data = mem; - field->binary.length = length; + field->binary.data = mem; + field->binary.length = length; - return 0; + return 0; } /* - * NAME: field->getint() - * DESCRIPTION: return the value of an integer field + * NAME: field->getint() + * DESCRIPTION: return the value of an integer field */ -signed long id3_field_getint(union id3_field const *field) +signed long +id3_field_getint(union id3_field const *field) |