📄 field.c
字号:
*/
int id3_field_settextencoding(union id3_field *field,
enum id3_field_textencoding encoding)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_TEXTENCODING)
return -1;
id3_field_finish(field);
field->number.value = encoding;
return 0;
}
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;
}
field->latin1.ptr = data;
return 0;
}
/*
* NAME: field->setlatin1()
* DESCRIPTION: set the value of a latin1 field
*/
int id3_field_setlatin1(union id3_field *field, id3_latin1_t const *latin1)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1)
return -1;
id3_field_finish(field);
if (latin1) {
id3_latin1_t const *ptr;
for (ptr = latin1; *ptr; ++ptr) {
if (*ptr == '\n')
return -1;
}
}
return set_latin1(field, latin1);
}
/*
* 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)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1FULL)
return -1;
id3_field_finish(field);
return set_latin1(field, latin1);
}
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;
}
field->string.ptr = data;
return 0;
}
/*
* NAME: field->setstring()
* DESCRIPTION: set the value of a string field
*/
int id3_field_setstring(union id3_field *field, id3_ucs4_t const *string)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRING)
return -1;
id3_field_finish(field);
if (string) {
id3_ucs4_t const *ptr;
for (ptr = string; *ptr; ++ptr) {
if (*ptr == '\n')
return -1;
}
}
return set_string(field, string);
}
/*
* 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)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGFULL)
return -1;
id3_field_finish(field);
return set_string(field, string);
}
/*
* 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)
{
id3_ucs4_t **strings;
unsigned int i;
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST)
return -1;
id3_field_finish(field);
if (length == 0)
return 0;
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]);
free(strings);
return -1;
}
}
field->stringlist.strings = strings;
field->stringlist.nstrings = length;
return 0;
}
/*
* NAME: field->addstring()
* DESCRIPTION: add a string to a stringlist field
*/
int id3_field_addstring(union id3_field *field, id3_ucs4_t const *string)
{
id3_ucs4_t *new, **strings;
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST)
return -1;
if (string == 0)
string = id3_ucs4_empty;
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;
}
field->stringlist.strings = strings;
field->stringlist.strings[field->stringlist.nstrings++] = new;
return 0;
}
/*
* NAME: field->setlanguage()
* DESCRIPTION: set the value of a language field
*/
int id3_field_setlanguage(union id3_field *field, char const *language)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LANGUAGE)
return -1;
id3_field_finish(field);
if (language) {
if (strlen(language) != 3)
return -1;
strcpy(field->immediate.value, language);
}
return 0;
}
/*
* NAME: field->setframeid()
* DESCRIPTION: set the value of a frameid field
*/
int id3_field_setframeid(union id3_field *field, char const *id)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_FRAMEID ||
!id3_frame_validid(id))
return -1;
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;
return 0;
}
/*
* 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)
{
id3_byte_t *mem;
assert(field);
if (field->type != ID3_FIELD_TYPE_BINARYDATA)
return -1;
id3_field_finish(field);
if (length == 0)
mem = 0;
else {
mem = malloc(length);
if (mem == 0)
return -1;
assert(data);
memcpy(mem, data, length);
}
field->binary.data = mem;
field->binary.length = length;
return 0;
}
/*
* NAME: field->getint()
* DESCRIPTION: return the value of an integer field
*/
signed long id3_field_getint(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_INT8 &&
field->type != ID3_FIELD_TYPE_INT16 &&
field->type != ID3_FIELD_TYPE_INT24 &&
field->type != ID3_FIELD_TYPE_INT32)
return -1;
return field->number.value;
}
/*
* NAME: field->gettextencoding()
* DESCRIPTION: return the value of a text encoding field
*/
enum id3_field_textencoding
id3_field_gettextencoding(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_TEXTENCODING)
return -1;
return field->number.value;
}
/*
* NAME: field->getlatin1()
* DESCRIPTION: return the value of a latin1 field
*/
id3_latin1_t const *id3_field_getlatin1(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1)
return 0;
return field->latin1.ptr ? field->latin1.ptr : (id3_latin1_t const *) "";
}
/*
* NAME: field->getfulllatin1()
* DESCRIPTION: return the value of a full latin1 field
*/
id3_latin1_t const *id3_field_getfulllatin1(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1FULL)
return 0;
return field->latin1.ptr ? field->latin1.ptr : (id3_latin1_t const *) "";
}
/*
* NAME: field->getstring()
* DESCRIPTION: return the value of a string field
*/
id3_ucs4_t const *id3_field_getstring(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRING)
return 0;
return field->string.ptr ? field->string.ptr : id3_ucs4_empty;
}
/*
* NAME: field->getfullstring()
* DESCRIPTION: return the value of a fullstring field
*/
id3_ucs4_t const *id3_field_getfullstring(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGFULL)
return 0;
return field->string.ptr ? field->string.ptr : id3_ucs4_empty;
}
/*
* NAME: field->getnstrings()
* DESCRIPTION: return the number of strings in a stringlist field
*/
unsigned int id3_field_getnstrings(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST)
return 0;
return field->stringlist.nstrings;
}
/*
* NAME: field->getstrings()
* DESCRIPTION: return one value of a stringlist field
*/
id3_ucs4_t const *id3_field_getstrings(union id3_field const *field,
unsigned int index)
{
id3_ucs4_t const *string;
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST ||
index >= field->stringlist.nstrings)
return 0;
string = field->stringlist.strings[index];
return string ? string : id3_ucs4_empty;
}
/*
* NAME: field->getframeid()
* DESCRIPTION: return the value of a frameid field
*/
char const *id3_field_getframeid(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_FRAMEID)
return 0;
return field->immediate.value;
}
/*
* NAME: field->getbinarydata()
* DESCRIPTION: return the value of a binarydata field
*/
id3_byte_t const *id3_field_getbinarydata(union id3_field const *field,
id3_length_t *length)
{
//FIXMAD
// static id3_byte_t const empty=0;
id3_byte_t const empty=0;
assert(field && length);
if (field->type != ID3_FIELD_TYPE_BINARYDATA)
return 0;
assert(field->binary.length == 0 || field->binary.data);
*length = field->binary.length;
return field->binary.data ? field->binary.data : ∅
// return 2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -