diff options
Diffstat (limited to 'mplib/src/mplib_paas.c')
-rwxr-xr-x | mplib/src/mplib_paas.c | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/mplib/src/mplib_paas.c b/mplib/src/mplib_paas.c new file mode 100755 index 0000000..441e474 --- /dev/null +++ b/mplib/src/mplib_paas.c @@ -0,0 +1,256 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#elif HAVE_STRINGS_H +# include <strings.h> +#endif /*STDC_HEADERS*/ + +#if HAVE_UNISTD_H +# include <unistd.h> +# include <sys/types.h> +#endif + +#include <errno.h> +#include <stdio.h> +#include <fcntl.h> + +#include "mplib.h" +#include "xmalloc.h" + + + +/******************************************************************************************* + * Parse functions + *******************************************************************************************/ + + id3_text_content* + mp_parse_artist(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_title(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_album(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_year(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_genre(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_track(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_comment_content* + mp_parse_comment(const id3_content* content) + { + id3_comment_content* cc; + int i, e; + + if(!content || !content->data) + { + errno = MP_EERROR; + return NULL; + } + + if(content->encrypted) + { + errno = MP_EFENCR; + return NULL; + } + if(content->compressed) + { + errno = MP_EFCOMPR; + return NULL; + } + + cc = XMALLOCD0(id3_comment_content, "mp_parse_comment:cc"); + + e = content->data[0]; + if(e >= ISO_8859_1 && e <= UTF8) cc->encoding = e; + else cc->encoding = 0; + + cc->language = xmallocd(4, "mp_parse_comment:cc->language"); + cc->language[0] = content->data[1]; + cc->language[1] = content->data[2]; + cc->language[2] = content->data[3]; + cc->language[3] = 0; + + if(content->data[4]) /* short descr. */ + { + i = strlen(content->data + 4) + 1; + cc->short_descr = xmallocd(i, "mp_parse_comment:cc->short_descr"); + strncpy(cc->short_descr, content->data + 4, i); + } + else + { + cc->short_descr = NULL; + i = 1; + } + + cc->text = xmallocd(content->length - 4 - i + 1, "mp_parse_comment:cc->text"); + memcpy(cc->text, content->data + 4 + i, content->length - 4 - i); + cc->text[content->length - 4 - i] = 0; + + return cc; + } + + id3_text_content* + mp_parse_text(const id3_content* content) + { + id3_text_content* tc; + int e; + + if(!content || !content->data) + { + errno = MP_EERROR; + return NULL; + } + + if(content->encrypted) + { + errno = MP_EFENCR; + return NULL; + } + if(content->compressed) + { + errno = MP_EFCOMPR; + return NULL; + } + + tc = XMALLOCD0(id3_text_content, "mp_parse_text:tc"); + tc->text = xmallocd(content->length, "mp_parse_text:tc->text"); + e = content->data[0]; + if(e >= ISO_8859_1 && e <= UTF8) tc->encoding = e; + else tc->encoding = 0; + + memcpy(tc->text, content->data + 1, content->length - 1); + tc->text[content->length - 1] = 0; + /* XXX multiple entries */ + return tc; + } + + /******************************************************************************************* + * Assemble functions + *******************************************************************************************/ + + id3_content* + mp_assemble_artist_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_title_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_album_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_year_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_genre_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_text_content(const char* text, id3_encoding enc) + { + id3_content *ret; + + if(!text) return NULL; + + ret = XMALLOCD0(id3_content, "mp_assemble_text_content:ret"); + ret->length = strlen(text) + 1; + ret->data = xmallocd(ret->length, "mp_asseble_text_content:ret->data"); + ret->data[0] = enc; + strncpy(ret->data + 1, text, strlen(text)); + + return ret; + } + + id3_content* + mp_assemble_comment_content(const char* text, const char* short_descr, id3_encoding enc, const char* lang) + { + id3_content *ret; + + if(!text) return NULL; + + ret = XMALLOCD0(id3_content, "mp_assemble_comment_content:ret"); + ret->length = strlen(text) + 5; + if(short_descr) ret->length += strlen(short_descr); + + ret->data = xmallocd(ret->length, "mp_assemble_comment_content:ret->data"); + ret->data[0] = enc; + if(lang && strlen(lang) == 3) + { + ret->data[1] = lang[0]; + ret->data[2] = lang[1]; + ret->data[3] = lang[2]; + } + else + { + ret->data[1] = 'X'; + ret->data[2] = 'X'; + ret->data[3] = 'X'; + } + if(short_descr) strcpy(ret->data + 4, short_descr); + else ret->data[4] = 0; + + if(short_descr) strncpy(ret->data + 5 + strlen(short_descr), text, strlen(text)); + else strncpy(ret->data + 5, text, strlen(text)); + + return ret; + + } |