aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libmpio/CMakeLists.txt3
-rw-r--r--libmpio/mplib/mplib.c1011
-rw-r--r--libmpio/mplib/mplib.h438
-rw-r--r--libmpio/mplib/mplib_paas.c256
-rw-r--r--libmpio/mplib/mplib_s.c1177
-rw-r--r--libmpio/mplib/mplib_s.h153
-rw-r--r--libmpio/mplib/xmalloc.c167
-rw-r--r--libmpio/mplib/xmalloc.h58
-rw-r--r--libmpio/src/id3.c298
-rw-r--r--libmpio/src/id3.h44
-rw-r--r--libmpio/src/mpio.c13
-rw-r--r--mpiosh/callback.c44
-rw-r--r--mpiosh/global.c6
-rw-r--r--mpiosh/mpiosh.c4
14 files changed, 2 insertions, 3670 deletions
diff --git a/libmpio/CMakeLists.txt b/libmpio/CMakeLists.txt
index 917833d..ce48530 100644
--- a/libmpio/CMakeLists.txt
+++ b/libmpio/CMakeLists.txt
@@ -9,7 +9,6 @@ include_directories (${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/mplib)
add_library (mpio STATIC src/mpio.c src/io.c src/debug.c src/smartmedia.c
- src/mmc.c src/directory.c src/fat.c src/ecc.c src/cis.c src/id3.c
- mplib/mplib.c mplib/mplib_paas.c mplib/mplib_s.c mplib/xmalloc.c)
+ src/mmc.c src/directory.c src/fat.c src/ecc.c src/cis.c)
target_link_libraries (mpio -lusb)
diff --git a/libmpio/mplib/mplib.c b/libmpio/mplib/mplib.c
deleted file mode 100644
index afa7066..0000000
--- a/libmpio/mplib/mplib.c
+++ /dev/null
@@ -1,1011 +0,0 @@
-/*
- * 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 "xmalloc.h"
-#include "mplib.h"
-#include "mplib_s.h"
-#include "mplib_s.c"
-
-
-
-/*******************************************************************************************
- * Extern functions
- *******************************************************************************************/
-
-
-
-/*******************************************************************************************
- * Get
- *******************************************************************************************/
-
- mpeg_header*
- mp_get_mpeg_header_from_file(const char* filename)
- {
- mpeg_header *ret;
- int fd;
-
- if(!filename) return NULL;
-
- fd = open(filename, O_RDONLY);
- if(fd == -1) return NULL;
-
- ret = mp_get_mpeg_header_from_fd(fd);
- close(fd);
- return ret;
- }
-
-
-mpeg_header*
-mp_get_mpeg_header_from_fd(int fd)
-{
- mpeg_header *h;
- unsigned char c[5];
-
- h = XMALLOCD(mpeg_header, "mp_get_mpeg_header_from_fd:h");
-
- if(id3_lseek_syncword(fd)) goto exit_on_error;
-
- if(read(fd, c, 4) < 4) goto exit_on_error;
-
- memset(h, 0, sizeof(h));
- h->syncword = (c[1] & 240);
- h->syncword <<= 8;
- h->syncword |= c[0];
- h->version = (c[1] & 8) >> 3;
- h->layer = (c[1] & 6) >> 1;
- h->protbit = (c[1] & 1);
- h->bitrate = (c[2] & 240) >> 4;
- h->samplingfreq = (c[2] & 12) >> 2;
- h->padbit = (c[2] & 2) >> 1;
- h->privbit = (c[2] & 1);
- h->mode = (c[3] & 192) >> 6;
- h->mode_ext = (c[3] & 48) >> 4;
- h->copyright = (c[3] & 8) >> 3;
- h->originalhome = (c[3] & 4) >> 2;
- h->emphasis = (c[3] & 3);
-
- return h;
-
- exit_on_error:
- xfree(h);
- return NULL;
-}
-
-char*
-mp_get_str_version(const mpeg_header *h)
-{
- return h->version == 0 ? "MPEG 2" : "MPEG 1";
-}
-
-char*
-mp_get_str_layer(const mpeg_header *h)
-{
- switch(h->layer)
- {
- case 1: return "Layer III";
- case 2: return "Layer II";
- case 3: return "Layer I";
- default: return "undefined";
- }
-}
-
-char*
-mp_get_str_bitrate(const mpeg_header *h)
-{
- char *buf = (char *)xmallocd0(11, "mp_get_str_bitrate:buf");
-
- if(h->version == 1) /* MPEG 1 */
- {
- switch(h->layer)
- {
- case 1:
- snprintf(buf, sizeof buf, "%d kBit/s", br_1_3[h->bitrate]);
- return buf;
- case 2:
- snprintf(buf, sizeof buf, "%d kBit/s", br_1_2[h->bitrate]);
- return buf;
- case 3:
- snprintf(buf, sizeof buf, "%d kBit/s", br_1_1[h->bitrate]);
- return buf;
- default:
- return "undefined";
- }
- }
- else /* MPEG 2 */
- {
- switch(h->layer)
- {
- case 1:
- snprintf(buf, sizeof buf, "%d kBit/s", br_2_3[h->bitrate]);
- return buf;
- case 2:
- snprintf(buf, sizeof buf, "%d kBit/s", br_2_2[h->bitrate]);
- return buf;
- case 3:
- snprintf(buf, sizeof buf, "%d kBit/s", br_2_1[h->bitrate]);
- return buf;
- default:
- return "undefined";
- }
- }
-}
-
-char*
-mp_get_str_samplingfreq(const mpeg_header *h)
-{
- if(h->version == 1)
- {
- switch(h->samplingfreq)
- {
- case 0: return "44100 Hz";
- case 1: return "48000 Hz";
- case 2: return "32000 Hz";
- default: return "undefined";
- }
- }
- else
- {
- switch(h->samplingfreq)
- {
- case 0: return "22050 Hz";
- case 1: return "24000 Hz";
- case 2: return "16000 Hz";
- default: return "undefined";
- }
- }
-}
-
-char*
-mp_get_str_mode(const mpeg_header *h)
-{
- switch(h->mode)
- {
- case 0: return "Stereo";
- case 1: return "Joint-Stereo";
- case 2: return "Dual-Channel";
- case 3: return "Mono";
- default: return "undefined";
- }
-}
-
-id3_tag_list*
-mp_get_tag_list_from_file(const char* filename)
-{
- id3_tag_list *ret;
- int fd;
-
- if(!filename) return NULL;
-
- fd = open(filename, O_RDONLY);
- if(fd == -1) return NULL;
-
- ret = mp_get_tag_list_from_fd(fd);
- close(fd);
- return ret;
-}
-
-id3_tag_list*
-mp_get_tag_list_from_fd(int fd)
-{
- id3_tag_list *tag_list = NULL;
- id3_tag_list *tag_list2 = NULL;
- id3v2_tag *v2tag = NULL;
- id3v1_tag *v1tag = NULL;
- id3_tag *tag = NULL;
-
- v2tag = id3v2_get_tag(fd);
- if(v2tag)
- {
- tag = XMALLOCD0(id3_tag, "mp_get_tag_list_from_fd:tag");
- if(v2tag->header->version_minor == 3 || v2tag->header->version_minor == 4)
- tag->version = 2;
- else
- tag->version = -1;
- tag->tag = v2tag;
-
- tag_list = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list");
- tag_list->tag = tag;
- tag_list->next = NULL;
- tag_list->first = tag_list;
- }
-
- v1tag = id3v1_get_tag(fd);
- if(v1tag)
- {
- tag = XMALLOCD(id3_tag, "mp_get_tag_list_from_fd:tag");
- tag->version = 1;
- tag->tag = v1tag;
-
- if(tag_list)
- {
- tag_list2 = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list2");
- tag_list2->tag = tag;
- tag_list2->next = NULL;
- tag_list2->first = tag_list;
- tag_list->next = tag_list2;
- }
- else
- {
- tag_list = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list");
- tag_list->tag = tag;
- tag_list->next = NULL;
- tag_list->first = tag_list;
- }
- }
-
- return tag_list;
-}
-
-id3_content*
-mp_get_content(const id3_tag *tag, int field)
-{
- return mp_get_content_at_pos(tag, field, 0);
-}
-
-id3_content*
-mp_get_content_at_pos(const id3_tag *tag, int field, int pos)
-{
- int i;
- char *c;
- id3_content *ret;
-
- if(!tag || !tag->tag)
- {
- errno = MP_EERROR;
- return NULL;
- }
-
- if(tag->version == 1)
- {
- if(pos != 0)
- {
- errno = MP_EERROR;
- return NULL;
- }
- else return id3v1_get_content(tag->tag, field);
- }
- else if(tag->version == 2)
- {
- id3v2_tag *v2 = tag->tag;
- char *val;
-
- switch(field)
- {
- case MP_ARTIST:
- return mp_get_content_custom_at_pos(tag, "TPE1", pos);
- case MP_TITLE:
- return mp_get_content_custom_at_pos(tag, "TIT2", pos);
- case MP_ALBUM:
- return mp_get_content_custom_at_pos(tag, "TALB", pos);
- case MP_GENRE:
- return mp_get_content_custom_at_pos(tag, "TCON", pos);
- case MP_COMMENT:
- return mp_get_content_custom_at_pos(tag, "COMM", pos);
- case MP_YEAR:
- return mp_get_content_custom_at_pos(tag, "TYER", pos);
- case MP_TRACK:
- return mp_get_content_custom_at_pos(tag, "TRCK", pos);
- }
- errno = MP_EFNF;
- return NULL;
- }
- else
- {
- errno = MP_EVERSION;
- return NULL;
- }
-}
-
-id3_content*
-mp_get_content_custom(const id3_tag* tag, const char*field)
-{
- if(!tag)
- {
- errno = MP_EERROR;
- return NULL;
- }
- else if(tag->version != 2)
- {
- errno = MP_EVERSION;
- return NULL;
- }
-
- return id3v2_get_content_at_pos(tag->tag, field, 0);
-
-}
-
-id3_content*
-mp_get_content_custom_at_pos(const id3_tag* tag, const char*field, int pos)
-{
- if(!tag)
- {
- errno = MP_EERROR;
- return NULL;
- }
- else if(tag->version != 2)
- {
- errno = MP_EVERSION;
- return NULL;
- }
-
-
- return id3v2_get_content_at_pos(tag->tag, field, pos);
-}
-
-
-/*******************************************************************************************
- * Set
- *******************************************************************************************/
-
- int
- mp_set_content(id3_tag* tag, const int field, id3_content* new_content)
- {
- id3v1_tag *v1;
- id3v2_tag *v2;
-
-
- if(!tag) return MP_EERROR;
-
- if(tag->version == 2)
- {
- return mp_set_content_at_pos(tag, field, new_content, 0);
- }
- else if(tag->version == 1)
- {
- unsigned char c;
- char *my_val;
- int len, j;
-
- v1 = tag->tag;
-
- switch(field)
- {
-
-#define FLD(str1, str2, str3, str4) \
- case str1:\
- if(!new_content) v1->str2 = NULL;\
- else\
- {\
- id3_text_content *tc = str4(new_content);\
- if(strlen(tc->text) > str3 || tc->encoding != ISO_8859_1)\
- {\
- mp_convert_to_v2(tag);\
- mp_free_text_content(tc);\
- return mp_set_content(tag, field, new_content);\
- }\
- \
- v1->str2 = tc->text;\
- xfree(tc);\
- }\
- break;
-
- FLD(MP_ARTIST, artist, 30, mp_parse_artist);
- FLD(MP_TITLE, title, 30, mp_parse_title);
- FLD(MP_ALBUM, album, 30, mp_parse_album);
- FLD(MP_YEAR, year, 4, mp_parse_year);
-
- case MP_COMMENT:
- if(!new_content) v1->comment = NULL;
- else
- {
- id3_comment_content *tc = mp_parse_comment(new_content);
- if(strlen(tc->text) > 30 || tc->short_descr || tc->encoding != ISO_8859_1)
- {
- mp_convert_to_v2(tag);
- mp_free_comment_content(tc);
- return mp_set_content(tag, field, new_content);
- }
- v1->comment = xmallocd0(strlen(tc->text)+1,
- "mp_set_content:v1->comment");
- memcpy(v1->comment, tc->text, strlen(tc->text));
- mp_free_comment_content(tc);
- }
- break;
-
- case MP_TRACK:
- if(!new_content) v1->track = 0;
- else
- {
- id3_text_content *tc = mp_parse_track(new_content);
-#ifdef HAVE_STRTOL
- errno = 0;
- j = strtol(tc->text, (char **)NULL, 10);
- if(errno != ERANGE) v1->track = j;
- else return MP_EERROR;
-#else
- v1->track = atoi(tc->text);
-#endif
- mp_free_text_content(tc);
- }
- break;
-
- case MP_GENRE:
- if(!new_content) v1->genre = 0xFF;
- else
- {
- int b = 0, i;
- id3_text_content *tc = mp_parse_genre(new_content);
- /* i = strlen(tc->text); */
- for(c = 0; c < GLL; c++) {
- if(!strcmp(genre_list[c], tc->text))
- {
- v1->genre = c;
- b = 1;
- }
- }
- mp_free_text_content(tc);
- if(!b)
- {
- mp_convert_to_v2(tag);
- return mp_set_content(tag, field, new_content);
- }
- break;
- }
- }
- }
- else if(tag->version == -1) return MP_EVERSION;
- else return MP_EFNF;
-
- return 0;
- }
-
-int
-mp_set_content_at_pos(id3_tag* tag, const int field, id3_content* new_content, int pos)
-{
- char* c;
-
- if(!tag) return MP_EERROR;
- if(field < MP_ARTIST || field > MP_TRACK) return MP_EFNF;
-
- if(tag->version == 1 && pos == 0) return mp_set_content(tag, field, new_content);
-
- switch(field)
- {
- case MP_ARTIST: c = "TPE1"; break;
- case MP_TITLE: c = "TIT2"; break;
- case MP_ALBUM: c = "TALB"; break;
- case MP_TRACK: c = "TRCK"; break;
- case MP_YEAR: c = "TYER"; break;
- case MP_COMMENT: c = "COMM"; break;
- case MP_GENRE: c = "TCON"; break;
- }
- return mp_set_custom_content_at_pos(tag, c, new_content, pos);
-}
-
-int
-mp_set_custom_content(id3_tag* tag, char* field, id3_content* new_content)
-{
- return mp_set_custom_content_at_pos(tag, field, new_content, 0);
-}
-
-int
-mp_set_custom_content_at_pos(id3_tag* tag, char* field, id3_content* new_content, int pos)
-{
- id3v2_tag *v2;
-
- if(!tag || !field || strlen(field) != 4) return MP_EERROR;
-
- if(tag->version == 1)
- {
- if(mp_convert_to_v2(tag))
- return MP_EERROR;
- }
- else if(tag->version == -1) return MP_EVERSION;
-
- v2 = (id3v2_tag*)tag->tag;
- if(!v2->frame_list)
- {
- v2->frame_list = XMALLOCD0(id3v2_frame_list,
- "mp_set_custom_content_at_pos:v2->frame_list");
- id3_add_frame(v2->frame_list, field, new_content->data, new_content->length);
- }
- else
- {
- id3v2_frame *frame;
-
- if((frame = id3_lookup_frame(v2->frame_list, field, pos)))
- {
- if(new_content)
- {
- long len, len_sync;
- /* make sync safe */
- len = new_content->length;
- len_sync = id3_sync(new_content->data, len);
-
- xfree(frame->data);
- frame->data = xmallocd(new_content->length,
- "mp_set_custom_content_at_pos:frame->data");
- memcpy(frame->data, new_content->data, new_content->length);
- frame->status_flag = 0;
- if(len != len_sync) frame->format_flag = 64;
- else frame->format_flag = 0;
- frame->data_size = len_sync;
- }
- else id3_remove_frame(v2->frame_list, frame);
- }
- else if(pos == 0) id3_add_frame(v2->frame_list, field, new_content->data, new_content->length);
- else return MP_EFNF;
- }
-
- return 0;
-}
-
-/*******************************************************************************************
- * Write & delete
- *******************************************************************************************/
- int
- mp_write_to_file(const id3_tag_list* tag_list, const char *filename)
- {
- int ret;
- int fd;
-
- if(!filename) return MP_EERROR;
-
- fd = open(filename, O_RDWR);
- if(fd == -1) return MP_EERROR;
-
- ret = mp_write_to_fd(tag_list, fd);
- close(fd);
- return ret;
- }
-
-
- int
- mp_write_to_fd(const id3_tag_list* tag_list, const int fd)
- {
- id3_tag *tag;
- id3v1_tag *v1;
- id3v2_tag *v2;
- id3_tag_list *mylist;
- int ret = 0;
-
- if(!tag_list) {
- ret |= id3v1_del_tag(fd);
- ret |= id3v2_del_tag(fd, NULL);
- return ret;
- }
-
- while(tag_list)
- {
- tag = tag_list->tag;
- if(!tag)
- {
- tag_list = tag_list->next;
- continue;
- }
-
- if(tag->version == 1)
- {
- id3v1_del_tag(fd);
- ret |= id3v1_add_tag(fd, tag->tag);
- }
- else if(tag->version == 2)
- {
- int pad = 0;
- id3v2_frame_list *frame_list;
- id3v2_tag *old_v2;
- id3v2_tag *v2 = tag->tag;
-
- /* calculate tag size */
- v2->header->total_tag_size = 10;
- if(v2->header->has_footer) v2->header->total_tag_size += 10;
- if(v2->header->has_extended_header) v2->header->total_tag_size += v2->header->extended_header->size;
- frame_list = v2->frame_list;
- while(frame_list)
- {
- v2->header->total_tag_size += frame_list->data->data_size + 10;
- frame_list = frame_list->next;
- }
-
- /* this is where padding handling takes place */
- /* we must get the old tag to see if padding can be used */
- old_v2 = id3v2_get_tag(fd);
- if(old_v2) {
- if(v2->header->total_tag_size > old_v2->header->total_tag_size)
- {
- /* padding not sufficent */
- ret |= id3v2_del_tag(fd, old_v2);
- ret |= id3v2_add_tag(fd, v2, NULL);
- }
- else
- {
- ret |= id3v2_add_tag(fd, v2, old_v2);
- }
- id3v2_free_tag(old_v2);
- } else {
- ret |= id3v2_add_tag(fd, v2, NULL);
- }
-
- }
- else
- {
- ret |= MP_EVERSION;
- }
-
- tag_list = tag_list->next;
- } /* tag list */
-
- return ret;
- }
-
-int
-mp_del_tags_from_file(const char* filename)
-{
- int ret, fd;
-
- if(!filename) return 1;
-
- fd = open(filename, O_RDWR);
- if(fd == -1) return 1;
-
- ret = mp_del_tags_from_fd(fd);
- close(fd);
- return ret;
-}
-
-int
-mp_del_tags_from_fd(const int fd)
-{
- int ret = 0;
-
- ret |= id3v1_del_tag(fd);
- ret |= id3v2_del_tag(fd, NULL);
-
- return ret;
-}
-
-int
-mp_del_tags_by_ver_from_file(const char* filename, const int version)
-{
- int fd, ret;
-
- if(!filename) return 1;
-
- fd = open(filename, O_RDWR);
- if(fd == -1) return 1;
-
- ret = mp_del_tags_by_ver_from_fd(fd, version);
- close(fd);
- return ret;
-}
-
-int
-mp_del_tags_by_ver_from_fd(const int fd, const int version)
-{
- if(version == 1) return id3v1_del_tag(fd);
- else if(version == 2) return id3v2_del_tag(fd, NULL);
- else return MP_EVERSION;
-}
-
-
-
-
-/*******************************************************************************************
- * Misc
- *******************************************************************************************/
-
- int
- mp_convert_to_v2(id3_tag *tag)
- {
- id3v1_tag *v1;
- id3_tag *tmp;
- id3_content* content;
-
- if(tag->version == 2) return 0;
- else if(tag->version == -1) return MP_EVERSION;
-
- tmp = mp_alloc_tag_with_version(2);
-
- v1 = (id3v1_tag*)tag->tag;
-
- content = mp_assemble_text_content(v1->artist, ISO_8859_1);
- if(v1->artist) mp_set_content(tmp, MP_ARTIST, content);
-
- content = mp_assemble_text_content(v1->title, ISO_8859_1);
- if(v1->title) mp_set_content(tmp, MP_TITLE, content);
-
- content = mp_assemble_text_content(v1->album, ISO_8859_1);
- if(v1->album) mp_set_content(tmp, MP_ALBUM, content);
-
- content = mp_assemble_text_content(v1->year, ISO_8859_1);
- if(v1->year) mp_set_content(tmp, MP_YEAR, content);
-
- content = mp_assemble_comment_content(v1->comment, NULL, ISO_8859_1, NULL);
- if(v1->comment) mp_set_content(tmp, MP_COMMENT, content);
-
- if(v1->genre != 0xFF)
- {
- char *c = xmallocd(strlen(genre_list[v1->genre]) + 1,
- "mp_convert_to_v2:c");
- strcpy(c, genre_list[v1->genre]);
- content = mp_assemble_text_content(c, ISO_8859_1);
- mp_set_content(tmp, MP_GENRE, content);
- }
- if(v1->track > 0)
- {
- char *trk = (char *)xmallocd(4, "mp_convert_to_v2:trk");
- snprintf(trk, 3, "%d", v1->track);
- trk[3] = 0;
- content = mp_assemble_text_content(trk, ISO_8859_1);
- mp_set_content(tmp, MP_TRACK, content);
- }
-
- tag->version = 2;
- tag->tag = tmp->tag;
-
- id3v1_free_tag(v1);
- xfree(tmp);
-
- return 0;
- }
-
-int
-mp_convert_to_v1(id3_tag *tag)
-{
- id3v1_tag *v1;
- id3_tag* tmp;
- id3_content* content;
- id3_text_content* tc;
- id3_comment_content* cc;
- char* c;
- int j, k = 0;
-
- if(tag->version == 1) return 0;
- else if(tag->version == -1) return MP_EVERSION;
-
- v1 = XMALLOCD0(id3v1_tag, "mp_convert_to_v1:v1");
-
- content = mp_get_content(tag, MP_ARTIST);
- tc = mp_parse_artist(content);
- v1->artist = tc->text;
- xfree(tc);
- mp_free_content(content);
-
- content = mp_get_content(tag, MP_TITLE);
- tc = mp_parse_title(content);
- v1->title = tc->text;
- xfree(tc);
- mp_free_content(content);
-
- content = mp_get_content(tag, MP_ALBUM);
- tc = mp_parse_album(content);
- v1->album = tc->text;
- xfree(tc);
- mp_free_content(content);
-
- content = mp_get_content(tag, MP_YEAR);
- tc = mp_parse_year(content);
- v1->year = tc->text;
- xfree(tc);
- mp_free_content(content);
-
- content = mp_get_content(tag, MP_COMMENT);
- cc = mp_parse_comment(content);
- v1->comment = cc->text;
- xfree(cc->language);
- xfree(cc->short_descr);
- xfree(cc);
- mp_free_content(content);
-
- content = mp_get_content(tag, MP_TRACK);
- tc = mp_parse_track(content);
- c = tc->text;
- if(c)
- {
-#ifdef HAVE_STRTOL
- errno = 0;
- j = strtol(c, (char **)NULL, 10);
- if(errno != ERANGE) v1->track = j;
- else v1->track = 0;
-#else
- v1->track = atoi(c);
-#endif
- }
- else v1->track = 0;
- xfree(c);
- mp_free_text_content(tc);
- mp_free_content(content);
-
- content = mp_get_content(tag, MP_GENRE);
- tc = mp_parse_genre(content);
- c = tc->text;
- for(j = 0; c, j < GLL; j++) {
- if(!strcmp(genre_list[j], c))
- {
- v1->genre = j;
- k = 1;
- }
- }
- if(!c) v1->genre = 0xFF;
- xfree(c);
- mp_free_text_content(tc);
- mp_free_content(content);
-
- id3v1_truncate_tag(v1);
-
- id3v2_free_tag(tag->tag);
-
- tag->version = 1;
- tag->tag = v1;
-
- return 0;
-}
-
-int
-mp_is_valid_v1_value(int field, char *value)
-{
- int len = 30;
- int j;
-
- switch(field) {
- case MP_YEAR:
- len = 4;
- break;
-
- case MP_TRACK:
-#ifdef HAVE_STRTOL
- errno = 0;
- j = strtol(value, (char **)NULL, 10);
- if(errno != ERANGE) return 1;
- else return 0;
-#else
- return 1; /* poor fellow */
-#endif
-
- case MP_GENRE:
- for(j = 0; j < GLL; j++) {
- if(!strcmp(genre_list[j], value))
- {
- return 1;
- }
- return 0;
- }
- }
-
- /* Check string length */
- if(strlen(value) > len) return 0;
- else return 1;
-}
-
-
-void
-mp_free_list(id3_tag_list *list)
-{
- if(!list) return;
-
- /* free tag */
- if(list->tag) mp_free_tag(list->tag);
-
- /* free next element */
- if(list->next) mp_free_list(list->next);
-
- /* free this element */
- xfree(list);
-}
-
-id3_tag*
-mp_alloc_tag(void)
-{
- /* The tags initialized version makes a different. Generally spoken, we
- like to make id3v1 tags if possible and therefor set the version to 1
- here. This matters in mp_set_content(). */
- return mp_alloc_tag_with_version(1);
-}
-
-id3_tag*
-mp_alloc_tag_with_version(int v)
-{
- id3_tag* ret;
-
- if(v != 1 && v != 2) return NULL;
-
- ret = XMALLOCD(id3_tag, "mp_alloc_tag_with_version:ret");
- ret->version = v;
- if(v == 1)
- {
- ret->tag = XMALLOCD0(id3v1_tag, "mp_alloc_tag_with_version:ret->tag");
- ((id3v1_tag*)ret->tag)->genre = 0xFF;
- }
- else
- {
- id3v2_tag *v2;
- /* XXX */
- ret->tag = XMALLOCD0(id3v2_tag, "mp_alloc_tag_with_version:ret->tag");
- v2 = (id3v2_tag*)ret->tag;
- v2->header = XMALLOCD0(id3v2_header, "mp_alloc_tag_with_version:v2->header");
-//if ID3VERSION == "2.4"
- v2->header->version_minor = 4;
-//else
- v2->header->version_minor = 3;
-//endif
- v2->header->version_revision = 0;
- v2->header->unsyncronization = 1;
- v2->header->has_extended_header = 0;
- v2->header->is_experimental = 1;
- v2->header->has_footer = 0;
- v2->header->flags = 0;
- v2->header->total_tag_size = 0;
- v2->header->extended_header = NULL;
- v2->frame_list = NULL;
- }
- return ret;
-}
-
-void
-mp_free_tag(id3_tag *tag)
-{
- if(!tag) return;
-
- if(tag->version == 1)
- {
- id3v1_free_tag(tag->tag);
- }
- else if(tag->version == 2)
- {
- id3v2_free_tag(tag->tag);
- }
- xfree(tag);
-}
-
-void
-mp_free_content(id3_content *content)
-{
- if(!content) return;
- xfree(content->data);
- xfree(content);
-}
-
-void
-mp_free_text_content(id3_text_content *content)
-{
- if(!content) return;
- xfree(content->text);
- xfree(content);
-}
-
-void
-mp_free_comment_content(id3_comment_content *content)
-{
- if(!content) return;
- xfree(content->language);
- xfree(content->short_descr);
- xfree(content->text);
- xfree(content);
-}
-
-
diff --git a/libmpio/mplib/mplib.h b/libmpio/mplib/mplib.h
deleted file mode 100644
index 8b3fe64..0000000
--- a/libmpio/mplib/mplib.h
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- * 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
- */
-
-#ifndef __MPLIB_H
-#define __MPLIB_H
-
-
-/* __BEGIN_DECLS should be used at the beginning of your declarations,
- so that C++ compilers don't mangle their names. Use __END_DECLS at
- the end of C declarations. */
-#undef __BEGIN_DECLS
-#undef __END_DECLS
-#ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-#else
-# define __BEGIN_DECLS /* empty */
-# define __END_DECLS /* empty */
-#endif
-
-/* __P is a macro used to wrap function prototypes, so that compilers
- that don't understand ANSI C prototypes still work, and ANSI C
- compilers can issue warnings about type mismatches. */
-#undef __P
-#if defined (__STDC__) || defined (_AIX) \
- || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
- || defined(WIN32) || defined(__cplusplus)
-# define __P(protos) protos
-#else
-# define __P(protos) ()
-#endif
-
-
-__BEGIN_DECLS
-
-
-
-/*************************************/
-/* Defines */
-/*************************************/
-
-#define MP_ARTIST 1
-#define MP_TITLE 2
-#define MP_ALBUM 3
-#define MP_GENRE 4
-#define MP_COMMENT 5
-#define MP_YEAR 6
-#define MP_TRACK 7
-
-#define ISO_8859_1 0
-#define UTF16 1
-#define UTF16BE 2
-#define UTF8 3
-
-
-/*************************************/
-/* errno values */
-/*************************************/
-#define MP_EERROR 1
-#define MP_EFNF 2
-#define MP_EFCOMPR 3
-#define MP_EFENCR 4
-/*define MP_EUNICODE 5*/
-#define MP_EVERSION 6
-
-
-/*************************************/
-/* Structs and company */
-/*************************************/
-
-/* Header structure with 4 segments containing 32 bit header information */
-typedef struct _mpeg_header
-{
- unsigned int syncword; /* Sync Word */
- unsigned int version; /* Version number */
- unsigned int layer; /* Layer number */
- unsigned int protbit; /* Protection Bit */
- unsigned int bitrate; /* kbit/sec */
- unsigned int samplingfreq; /* hz */
- unsigned int padbit; /* Padding bit */
- unsigned int privbit; /* Private Bit */
- unsigned int mode; /* Stereo, Joint-Stereo, Dual-Channel, Mono */
- unsigned int mode_ext; /* Mode extension */
- unsigned int copyright; /* Copyright yes/no */
- unsigned int originalhome; /* Original datastream yes/no */
- unsigned int emphasis; /* Emphasis bits */
-} mpeg_header;
-
-
-/* Generic tag structure */
-typedef struct _id3_tag
-{
- int version; /* tags version, either 1 or 2 or -1 if not supported */
- void *tag; /* pointer to specific struct */
-} id3_tag;
-
-
-/* list of tags found in file */
-typedef struct _id3_tag_list
-{
- id3_tag *tag;
- struct _id3_tag_list *next;
- struct _id3_tag_list *first;
-} id3_tag_list;
-
-
-/*
- * The following structures are ment as low-level data holders. I strongly
- * suggest you to use the appropriate generic functions below to access them.
- */
-
-/* V 1 */
-
-/* ID3v1 tag structure */
-typedef struct _id3v1_tag
-{
- char *title;
- char *artist;
- char *album;
- char *year;
- char *comment;
- unsigned char track; /* track binary encoded */
- unsigned char genre; /* index on genre list - 0xFF for null */
-} id3v1_tag;
-
-
-/* V 2 */
-
-/* ID3v2 Frame structure */
-typedef struct _id3v2_frame
-{
- char* frame_id; /* The frame id e.g. TALB */
- unsigned char status_flag;
- unsigned char format_flag;
- char *data;
- unsigned int data_size; /* frame size excluding header, incl. enc.,lang.,etc.
- (total frame size - 10) */
-} id3v2_frame;
-
-/* single linked list referencing a number of frames */
-typedef struct _id3v2_frame_list
-{
- struct _id3v2_frame *data;
- struct _id3v2_frame_list *next;
- struct _id3v2_frame_list *start;
-} id3v2_frame_list;
-
-/* ID3v2 Extended Header structure */
-typedef struct _id3v2_extended_header
-{
- unsigned long size;
- char *flag_bytes;
- unsigned int no_flag_bytes;
- unsigned int is_update;
- unsigned int crc_data_present;
- unsigned char crc_data_length;
- unsigned char* crc_data;
- unsigned int restrictions;
- unsigned char restrictions_data_length;
- unsigned char* restrictions_data;
-} id3v2_extended_header;
-
-/* ID3v2 Header structure */
-typedef struct _id3v2_header
-{
- /* Version 2.minor.revision */
- unsigned int version_minor;
- unsigned int version_revision;
- char flags; /* Flags - should only be set by mplib and does only contain
- the following infos */
- unsigned int unsyncronization;
- unsigned int has_extended_header;
- unsigned int is_experimental;
- unsigned int has_footer;
- unsigned long total_tag_size; /* is size of all tag elements including
- header and footer (each 10 bytes) */
- id3v2_extended_header *extended_header; /* Extended header */
-} id3v2_header;
-
-
-/* ID3v2 tag structure */
-typedef struct _id3v2_tag
-{
- id3v2_header *header;
- id3v2_frame_list *frame_list;
-} id3v2_tag;
-
-/* A fields content unparsed */
-typedef struct _id3_content
-{
- unsigned int compressed;
- unsigned int encrypted;
- char *data;
- unsigned int length;
-} id3_content;
-
-typedef enum _id3_encoding
-{
- iso_8859_1 = ISO_8859_1,
- utf16 = UTF16,
- utf16be = UTF16BE,
- utf8 = UTF8
-} id3_encoding;
-
-typedef struct _id3_text_content
-{
- id3_encoding encoding;
- char *text; /* Null terminated text */
-} id3_text_content;
-
-typedef struct _id3_comment_content
-{
- id3_encoding encoding;
- char *language; /* ISO Language code */
- char *short_descr; /* Null term. content short description */
- char *text; /* Null terminated text */
-} id3_comment_content;
-
-/***************************************/
-/* Functions */
-/***************************************/
-
-/* Allocates a MPEG header structure from a file
- * Arg 1 - The filename
- * Returns - A pointer to a new initialized header structure - NULL on IO Error
- */
-extern mpeg_header *mp_get_mpeg_header_from_file __P((const char*));
-
-
-/* Gets the header structure from a file descriptor
- * Arg 1 - The file descriptor
- * Returns - A pointer to a new initialized header structure - NULL on IO Error
- */
-extern mpeg_header *mp_get_mpeg_header_from_fd __P((int));
-
-
-/* Frees a mpeg header structure
- * Arg 1 - The allocated mpeg header
- */
-#define mp_free_mpeg_header(str) xfree(str)
-
-
-/* Allocates a label with the appropriate header field value as a string */
-extern char *mp_get_str_version __P((const mpeg_header*));
-extern char *mp_get_str_layer __P((const mpeg_header*));
-extern char *mp_get_str_bitrate __P((const mpeg_header*));
-extern char *mp_get_str_samplingfreq __P((const mpeg_header*));
-extern char *mp_get_str_mode __P((const mpeg_header*));
-
-
-/* Allocates and fills a list of tags found in the given file. This list
- * will contain at least one and at most two tags or is NULL if no tags
- * have been found.
- * Arg 1 - The files name/file descriptor to search for tags
- * Returns - A pointer to a initialized list struct or null if no tags have
- * been found
- */
-extern id3_tag_list* mp_get_tag_list_from_file __P((const char*));
-extern id3_tag_list* mp_get_tag_list_from_fd __P((int));
-
-
-/* Frees a tag list beginning with the given element XXX */
-extern void mp_free_list __P((id3_tag_list*));
-
-
-/* Gets the first content found of a specified field in the given tag and
- * allocates a struct.
- * Arg 1 - The tag
- * Arg 2 - The fields identifier
- *
- * Returns The new allocated content for the specified field or NULL
- * On NULL: errno set to the following values
- * MP_EERROR - General failure: may occure on wrong usage, but should never happen
- * MP_EFNF - Field does not exists in tag /invalid identifier
- * MP_EVERSION - Tag has a version set that is not supported by the library
- */
-extern id3_content* mp_get_content __P((const id3_tag*, int));
-
-/* It's posible that a tag has multiple ocurances of a field.
- * Use this function to get a specified field by position. The first
- * ocurance of the field in the tag is 0.
- * e.g.: To get the third comment in an id3v2 tag use
- * mp_get_content_at_pos(tag, MP_COMMENT, 2);
- * Arg 1 - The tag
- * Arg 2 - The fields identifier
- * Arg 3 - The content position in the tag
- * Returns - see mp_get_content
- */
-extern id3_content* mp_get_content_at_pos __P((const id3_tag*, int, int));
-
-/* Gets a custom fields content and allocates a struct. This function can
- * only be applied to ID3v2 tags. It will lookup a by the given identifier
- * and return its content.
- * Arg 1 - The tag
- * Arg 2 - The field names identifier e.g. ENCR
- * Returns - see mp_get_content
- */
-extern id3_content* mp_get_content_custom __P((const id3_tag*, const char*));
-
-/* See mp_get_content_at_pos() and mp_get_content_custom()
- * Arg 1 - The tag
- * Arg 2 - The field names identifier e.g. ENCR
- * Arg 3 - The content position in the tag
- * Returns - see mp_get_content
- */
-extern id3_content* mp_get_content_custom_at_pos __P((const id3_tag*, const char*, int));
-
-/* Frees a content struct */
-extern void mp_free_content __P((id3_content*));
-extern void mp_free_text_content __P((id3_text_content*));
-extern void mp_free_comment_content __P((id3_comment_content*));
-
-
-/* Copys the value of a specified field into the given tag. The content
- * argument may be freed after using this function. The way a content
- * is represented in a tag depends from the tags version and kind of field.
- * I.e. it may be nessecary to represent a track number as a binary value in a v1
- * tag or to embeded it into a frame for a v2 tag. The caller just needs to
- * give the correct identifier with the value as a id3_content and to take
- * care of freeing the id3_content value afterwards.
- * Arg 1 - The tag to edit
- * Arg 2 - The fields identifier
- * Arg 3 - The fields new content
- * Returns - 0 success or one of the following errors
- * MP_EERROR - General failure: may occure on wrong usage, but should never happen
- * MP_EFNF - Field does not exists in tag /invalid identifier
- * MP_EVERSION - Function isn't able to handle a tag of this version
- */
-extern int mp_set_content __P((id3_tag*, int, id3_content*));
-extern int mp_set_content_at_pos __P((id3_tag*, int, id3_content*, int));
-
-/* Sets up a new custom field with the given value
- * Arg 1 - The tag to edit
- * Arg 2 - The new fields name - A four chars upper case identifier e.g. ENCR
- * Arg 3 - The fields new content
- * Returns - See mp_set_content
- */
-extern int mp_set_custom_content __P((id3_tag*, char*, id3_content*));
-extern int mp_set_custom_content_at_pos __P((id3_tag*, char*, id3_content*, int));
-
-/* Writes the tag to the specified file
- * Arg 1 - The tag list to be added to file - may be NULL for deleting all tags
- * Arg 2 - The files name/file descriptor
- * Returns - 0 on success or one of the following errors
- * MP_EERROR - General failure: may occure on wrong usage, but should never happen
- * MP_EVERSION - Function isn't able to handle a tag of this version
- */
-extern int mp_write_to_file __P((const id3_tag_list*, const char*));
-extern int mp_write_to_fd __P((const id3_tag_list*, int));
-
-/* Deletes all tags in file
- * Arg 1 - The filename of fd
- * Return - 0 on success
- */
-extern int mp_del_tags_from_file __P((const char*));
-extern int mp_del_tags_from_fd __P((int));
-
-/* Deletes all tags in file with the specified version
- * Arg 1 - The filename or fd
- * Arg 2 - The version
- */
-extern int mp_del_tags_by_ver_from_file __P((const char*, int));
-extern int mp_del_tags_by_ver_from_fd __P((int, int));
-
-/* Converts a tag to id3v1 or id3v2 tag format
- * Arg 1 - The tag to be converted
- * Returns - 0 on success or one of the following errors
- * MP_EVERSION - Function isn't able to handle a tag of this version
- */
-extern int mp_convert_to_v1 __P((id3_tag*));
-extern int mp_convert_to_v2 __P((id3_tag*));
-
-/* Checks wether the given value would be a valid v1 field
- * Arg 1 - The field
- * Arg 2 - The value
- * Returns - 0 if test failed
- */
-extern int mp_is_valid_v1_value __P((int, char*));
-
-/* Parses a content field
- * Arg 1 - the content to parse
- * Returns - A pointer to a new initialized structure suitable for the content
- * or NULL
- * On NULL: errno set to the following values
- * MP_EERROR - General failure: may occure on wrong usage, but should never happen
- * MP_EFENCR - The value for this field has been encrypted and can thus not be retrieved
- * MP_EFCOMPR - The value for this field has been compressed and can thus not be retrieved
- */
-extern id3_text_content *mp_parse_artist __P((const id3_content*));
-extern id3_text_content *mp_parse_title __P((const id3_content*));
-extern id3_text_content *mp_parse_album __P((const id3_content*));
-extern id3_text_content *mp_parse_year __P((const id3_content*));
-extern id3_text_content *mp_parse_genre __P((const id3_content*));
-extern id3_text_content *mp_parse_track __P((const id3_content*));
-extern id3_text_content *mp_parse_text __P((const id3_content*));
-extern id3_comment_content *mp_parse_comment __P((const id3_content*));
-
-/* Assembles content from a comont text content
- * Arg 1 - the text
- * Arg 2 - the texts encoding (NULL)
- * Returns - A pointer to a new initialized content structure
- */
-extern id3_content *mp_assemble_text_content __P((const char*, id3_encoding));
-
-/* Assembles content from a comment
- * Arg 1 - the text
- * Arg 2 - a short describtion to the text (NULL)
- * Arg 3 - the texts encoding
- * Arg 4 - the comments language (NULL)
- * Returns - A pointer to a new initialized content structure
- */
-extern id3_content *mp_assemble_comment_content __P((const char*, const char*, id3_encoding, const char*));
-
-/* Gets a new allocated tag */
-extern id3_tag* mp_alloc_tag __P((void));
-extern id3_tag* mp_alloc_tag_with_version __P((int));
-
-/* Frees tag struct */
-extern void mp_free_tag __P((id3_tag *));
-
-__END_DECLS
-
-#endif /* __MPLIB_H */
diff --git a/libmpio/mplib/mplib_paas.c b/libmpio/mplib/mplib_paas.c
deleted file mode 100644
index 441e474..0000000
--- a/libmpio/mplib/mplib_paas.c
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * 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;
-
- }
diff --git a/libmpio/mplib/mplib_s.c b/libmpio/mplib/mplib_s.c
deleted file mode 100644
index 2c336b4..0000000
--- a/libmpio/mplib/mplib_s.c
+++ /dev/null
@@ -1,1177 +0,0 @@
-/*
- * 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 <ctype.h>
-#include <sys/stat.h>
-
-#include "mplib_s.h"
-#include "xmalloc.h"
-
-
-
-/******************************/
-/* Static functions */
-/******************************/
-
-static id3v1_tag*
-id3v1_get_tag(int fd)
-{
- id3v1_tag *tag;
- char *c;
-
- tag = XMALLOCD0(id3v1_tag, "id3v1_get_tag:tag");
-
- c = (char *)xmallocd(3, "id3v1_get_tag:c");
-
- if(lseek(fd, -128L, SEEK_END) == -1) goto exit_on_error;
- if(read(fd, c, 3) < 3) goto exit_on_error;
- if(strncmp(c, "TAG", 3) != 0) goto exit_on_error;
-
- tag->title = (char *)xmallocd(31, "id3v1_get_tag:tag->title");
- if(read(fd, tag->title, 30) < 30) goto exit_on_error;
- if(tag->title[0] == 0 || id3_is_only_space(tag->title, 30)) {
- xfree(tag->title);
- tag->title = NULL;
- } else tag->title[30] = 0;
-
- tag->artist = (char*)xmallocd(31, "id3v1_get_tag:tag->artist");
- if(read(fd, tag->artist, 30) < 30) goto exit_on_error;
- if(tag->artist[0] == 0 || id3_is_only_space(tag->artist, 30)) {
- xfree(tag->artist);
- tag->artist = NULL;
- } else tag->artist[30] = 0;
-
- tag->album = (char*)xmallocd(31, "id3v1_get_tag:tag->album");
- if(read(fd, tag->album, 30) < 30) goto exit_on_error;
- if(tag->album[0] == 0 || id3_is_only_space(tag->album, 30)) {
- xfree(tag->album);
- tag->album = NULL;
- } else tag->album[30] = 0;
-
- tag->year = (char*)xmallocd(5, "id3v1_get_tag:tag->year");
- if(read(fd, tag->year, 4) < 4) goto exit_on_error;
- if(tag->year[0] == 0 || id3_is_only_space(tag->year, 4)) {
- xfree(tag->year);
- tag->year = NULL;
- } else tag->year[4] = 0;
-
- tag->comment = (char*)xmallocd(31, "id3v1_get_tag:tag->comment");
- if(read(fd, tag->comment, 30) < 30) goto exit_on_error;
- tag->comment[30] = 0;
-
- if(read(fd, &(tag->genre), 1) < 1) goto exit_on_error;
-
- /* Looking for v1.1 track info */
- if(tag->comment && tag->comment[28] == 0 && tag->comment[29] != 0)
- {
- tag->track = tag->comment[29];
- tag->comment[29] = 0;
- }
- else
- {
- tag->track = 0;
- }
-
- /* Set comment to NULL if not set - this happens at this point because */
- /* there maybe a track info anyway */
- if(tag->comment[0] == 0 || id3_is_only_space(tag->comment, 28)) {
- xfree(tag->comment);
- tag->comment = NULL;
- }
-
- xfree(c);
- return tag;
-
- exit_on_error:
-
- xfree(c);
- id3v1_free_tag(tag);
- return NULL;
-}
-
-static int
-id3v1_add_tag(int fd, id3v1_tag *tag)
-{
- int i, j;
- void *blank, *set;
- char *b_tag, *b_tag_start;
-
- blank = xmallocd0(30, "id3v1_add_tag:blank");
- set = xmallocd(30, "id3v1_add_tag:set");
- memset(set, 0xFF, 30);
- b_tag = b_tag_start = (char *)xmallocd0(128, "id3v1_add_tag:b_tag");
-
- strncpy(b_tag, "TAG", 3); b_tag += 3;
-
- if(tag->title)
- {
- j = strlen(tag->title);
- strncpy(b_tag, tag->title, j); b_tag += j;
- i = 30 - j;
- if(i > 0)
- {
- strncpy(b_tag, blank, i); b_tag += i;
- }
- }
- else
- {
- strncpy(b_tag, blank, 30); b_tag += 30;
- }
-
- if(tag->artist)
- {
- j = strlen(tag->artist);
- strncpy(b_tag, tag->artist, j); b_tag += j;
- i = 30 - j;
- if(i > 0)
- {
- strncpy(b_tag, blank, i); b_tag += i;
- }
- }
- else
- {
- strncpy(b_tag, blank, 30); b_tag += 30;
- }
-
- if(tag->album)
- {
- j = strlen(tag->album);
- strncpy(b_tag, tag->album, j); b_tag += j;
- i = 30 - j;
- if(i > 0)
- {
- strncpy(b_tag, blank, i); b_tag += i;
- }
- }
- else
- {
- strncpy(b_tag, blank, 30); b_tag += 30;
- }
-
- if(tag->year)
- {
- j = strlen(tag->year);
- strncpy(b_tag, tag->year, j); b_tag += j;
- i = 4 - j;
- if(i > 0)
- {
- strncpy(b_tag, blank, i); b_tag += i;
- }
- }
- else
- {
- strncpy(b_tag, blank, 4); b_tag += 4;
- }
-
- if(tag->comment)
- {
- int hastrack = 0;
- j = strlen(tag->comment);
- if(tag->track > 0) hastrack = 1;
- if(hastrack && j > 28)
- {
- strncpy(b_tag, tag->comment, 28); b_tag += 28;
- }
- else
- {
- strncpy(b_tag, tag->comment, j); b_tag += j;
- i = ((tag->track > 0) ? 28 : 30) - j;
- }
- if(i > 0)
- {
- strncpy(b_tag, blank, i); b_tag += i;
- }
- }
- else
- {
- strncpy(b_tag, blank, (tag->track > 0) ? 28 : 30);
- b_tag += (tag->track > 0) ? 28 : 30;
- }
-
- if(tag->track > 0)
- {
- strncpy(b_tag, blank, 1); b_tag += 1;
- strncpy(b_tag, &(tag->track), 1); b_tag += 1;
- }
- if(tag->genre != 0xFF)
- {
- strncpy(b_tag, &(tag->genre), 1); b_tag += 1;
- }
- else
- {
- strncpy(b_tag, set, 1); b_tag += 1;
- }
-
- j = 0;
-
- if(lseek(fd, 0L, SEEK_END) != -1)
- {
- if(write(fd, b_tag - 128, 128) < 128) j = 1;
- }
- else j = 1;
-
- xfree(b_tag_start);
- xfree(blank);
- xfree(set);
-
- return j;
-}
-
-static int
-id3v2_add_tag(int fd, id3v2_tag *tag, id3v2_tag *old)
-{
- unsigned char *btag, *btag_start;
- unsigned char flag = 0;
- int i, j;
- char *b_tag, *b_tag_start, *d;
- id3v2_frame_list *frame_list;
- id3v2_frame *frame;
-
- /* at first we are going to write the tags raw data into
- the btag byte array */
- btag = btag_start = xmallocd0(tag->header->total_tag_size,
- "id3v2_add_tag:btag");
- strncpy(btag, "ID3", 3); btag += 3;
- *btag = (char)tag->header->version_minor; btag += 1;
- *btag = (char)tag->header->version_revision; btag += 1;
- flag |= ((tag->header->unsyncronization & 1) << 7);
- flag |= ((tag->header->has_extended_header & 1) << 6);
- flag |= ((tag->header->is_experimental & 1) << 5);
- flag |= ((tag->header->has_footer & 1) << 4);
- memcpy(btag, &flag, 1); btag += 1;
-
- if(old)
- {
- i = old->header->total_tag_size - 10;
- if(old->header->has_footer) i -= 10;
- }
- else
- {
- i = tag->header->total_tag_size - 10;
- if(tag->header->has_footer) i -= 10;
- /* add padding to total size we mean to store on disk */
- /* mplib does not use any kind of padding internaly */
-/* i += 1024; */ /* no padding needed for MPIO use */
- }
-
- d = id3_sync32(i);
- btag[0] = d[0];
- btag[1] = d[1];
- btag[2] = d[2];
- btag[3] = d[3];
- xfree(d);
- btag += 4;
-
- if(tag->header->has_extended_header)
- {
- d = id3_sync32(tag->header->extended_header->size);
- btag[0] = d[0];
- btag[1] = d[1];
- btag[2] = d[2];
- btag[3] = d[3];
- xfree(d);
- btag += 4;
-
- *btag = (char)tag->header->extended_header->no_flag_bytes; btag += 1;
- flag = ((tag->header->extended_header->is_update & 1) << 6);
- flag |= ((tag->header->extended_header->crc_data_present & 1) << 5);
- flag |= ((tag->header->extended_header->restrictions & 1) << 4);
- memcpy(btag, &flag, 1); btag += 1;
- if(tag->header->extended_header->is_update)
- {
- btag[0] = 0; btag += 1;
- }
- if(tag->header->extended_header->crc_data_present)
- {
- int length = tag->header->extended_header->crc_data_length ? tag->header->extended_header->crc_data_length : 5;
- *btag = (char)length; btag += 1;
- memcpy(btag, tag->header->extended_header->crc_data, length); btag += 1;
- }
- if(tag->header->extended_header->restrictions)
- {
- int length = tag->header->extended_header->restrictions_data_length ? tag->header->extended_header->restrictions_data_length : 5;
- *btag = (char)length; btag += 1;
- memcpy(btag, tag->header->extended_header->restrictions_data, length); btag += 1;
- }
- }
-
- frame_list = tag->frame_list;
- while(frame_list) {
- int j;
- frame = frame_list->data;
-
- strncpy(btag, frame->frame_id, 4); btag += 4;
- d = id3_sync32(frame->data_size);
- btag[0] = d[0];
- btag[1] = d[1];
- btag[2] = d[2];
- btag[3] = d[3];
- xfree(d);
- btag += 4;
- memcpy(btag, &frame->status_flag, 1); btag += 1;
- memcpy(btag, &frame->format_flag, 1); btag += 1;
-
- memcpy(btag, frame->data, frame->data_size); btag += frame->data_size;
-
- frame_list = frame_list->next;
- }
-
- /* XXX footer not supported yet */
-
- /* if an old tag was provided it is desired to overwrite it */
- /* else this is a brand new tag */
- if(old) {
- FILE *file;
- void *ptr = xmallocd0(old->header->total_tag_size - tag->header->total_tag_size, "id3v2_add_tag:ptr");
- if(!(file = fdopen(fd, "r+b")))
- {
- xfree(ptr);
- goto exit_on_error;
- }
-
- fseek(file, 0, SEEK_SET);
- if(fwrite(btag_start, tag->header->total_tag_size, 1, file) < 1)
- {
- xfree(ptr);
- goto exit_on_error;
- }
-
- /* write padding till end of old tag */
- if(fwrite(ptr, old->header->total_tag_size - tag->header->total_tag_size, 1, file) < 1) {
- xfree(ptr);
- goto exit_on_error;
- }
-
- fflush(file);
- xfree(ptr);
-
- } else {
- FILE *file, *tmp;
- int read;
- void *ptr, *blank;
- unsigned char *c;
-
- ptr = xmallocd(4096, "id3v2_add_tag:ptr");
- blank = xmallocd0(1024, "id3v2_add_tag:blank");
-
- file = fdopen(fd, "r+b");
- tmp = tmpfile();
- if(!(file && tmp))
- {
- fflush(file);
- fclose(tmp);
- xfree(ptr);
- xfree(blank);
- goto exit_on_error;
- }
-
- fseek(file, 0, SEEK_SET);
- fseek(tmp, 0, SEEK_SET);
-
- /* write tag in tmp file */
- fwrite(btag_start, tag->header->total_tag_size, 1, tmp);
-
- /* Write 1024b padding */
- /* no padding needed for MPIO use */
-/* fwrite(blank, 1024, 1, tmp); */
-
- /* write rest of file */
- while(!feof(file))
- {
- read = fread(ptr, 1, 4096, file);
- if(fwrite(ptr, 1, read, tmp) != read && !feof(file))
- {
- fflush(file);
- fclose(tmp);
- xfree(ptr);
- xfree(blank);
- goto exit_on_error;
- }
- }
-
- fflush(tmp);
-
- fseek(file, 0, SEEK_SET);
- fseek(tmp, 0, SEEK_SET);
- while(!feof(tmp))
- {
- read = fread(ptr, 1, 4096, tmp);
- if(fwrite(ptr, 1, read, file) != read && !feof(tmp))
- {
- fflush(file);
- fclose(tmp);
- xfree(ptr);
- xfree(blank);
- goto exit_on_error;
- }
- }
-
- fflush(file);
- fclose(tmp);
-
- xfree(ptr);
- xfree(blank);
- }
-
- xfree(btag_start);
- return 0;
-
- exit_on_error:
- xfree(btag_start);
- return MP_EERROR;
-}
-
-static int
-id3v1_del_tag(int fd)
-{
- int nlength;
- unsigned char *c;
- struct stat fs;
-
- if(fstat(fd, &fs)) return 1;
-
- if(fs.st_size < 128) return 1; /* Hardly a valid mpeg file.. */
-
- c = (char *)xmallocd(3, "id3v1_del_tag:c");
- if(lseek(fd, -128L, SEEK_END) == -1) goto exit_on_error;
- if(read(fd, c, 3) < 3) goto exit_on_error;
- if(strncmp(c, "TAG", 3)) goto exit_on_error;
- xfree(c);
-
- nlength = fs.st_size - 128;
-
- if(ftruncate(fd, nlength)) return 1;
-
- return 0;
-
- exit_on_error:
- xfree(c);
- return 1;
-}
-
-
-static int
-id3v2_del_tag(int fd, id3v2_tag *t)
-{
- unsigned char *c;
- long tag_len, file_len;
- FILE *file, *tmp;
- int read;
- void *ptr;
- id3v2_tag *tfound = NULL;;
-
- if(!t)
- {
- t = id3v2_get_tag(fd);
- if(!t) return 0;
- else tfound = t;
- }
-
- ptr = xmallocd(4096, "id3v2_del_tag:ptr");
-
- tag_len = t->header->total_tag_size;
- file_len = lseek(fd, 0, SEEK_END);
- if(file_len < 1 || tag_len < 1) goto exit_on_error;
-
- /* use os system buffering */
- file = fdopen(fd, "r+b");
- tmp = tmpfile();
- if(!(file && tmp)) goto exit_on_error;
-
- fseek(file, tag_len, SEEK_SET);
- fseek(tmp, 0, SEEK_SET);
- while(!feof(file))
- {
- read = fread(ptr, 1, 4096, file);
- if(fwrite(ptr, 1, read, tmp) != read && !feof(file))
- goto exit_on_error;
- }
-
- fflush(tmp);
-
- fseek(file, 0, SEEK_SET);
- fseek(tmp, 0, SEEK_SET);
- while(!feof(tmp))
- {
- read = fread(ptr, 1, 4096, tmp);
- if(fwrite(ptr, 1, read, file) != read && !feof(tmp))
- goto exit_on_error;
- }
-
- fclose(tmp);
- xfree(ptr);
- if(tfound) id3v2_free_tag(tfound);
- return 0;
-
- exit_on_error:
- fclose(tmp);
- xfree(ptr);
- if(tfound) id3v2_free_tag(tfound);
- return 1;
-}
-
-
-static int
-id3v1_truncate_tag(id3v1_tag *tag)
-{
- int notrunc = 0;
- int len = 0;
- void *ptr;
-
- if(tag->title && (len = strlen(tag->title)) > 30)
- {
- realloc(tag->title, 31);
- tag->title[30] = 0;
- }
-
- if(tag->artist && (len = strlen(tag->artist)) > 30)
- {
- realloc(tag->artist, 31);
- tag->artist[30] = 0;
- }
-
- if(tag->album && (len = strlen(tag->album)) > 30)
- {
- realloc(tag->album, 31);
- tag->album[30] = 0;
- }
-
- if(tag->year && (len = strlen(tag->year)) > 4)
- {
- realloc(tag->title, 5);
- tag->title[4] = 0;
- }
-
- if(tag->comment)
- {
- int max = (tag->track > 0) ? 28 : 30;
- if((len = strlen(tag->comment)) > max)
- {
- realloc(tag->comment, max + 1);
- tag->comment[max] = 0;
- }
- }
-
- return notrunc;
-}
-
-static int
-id3_is_only_space(char *str, int strlen)
-{
- int i = 0;
-
- while(i < strlen)
- {
- if(str[i] != 0x20) return 0;
- i++;
- }
-
- return 1;
-}
-
-static id3v2_tag*
-id3v2_get_tag(int fd)
-{
- unsigned char *c;
- id3v2_header *header;
- id3v2_frame_list *frame_list;
- id3v2_frame *frame;
- id3v2_tag *tag = NULL;
- int i;
-
- if(lseek(fd, 0L, SEEK_SET) == -1) return NULL;
-
- c = (unsigned char*)xmallocd0(1024, "id3v2_get_tag:c");
-
- if(read(fd, c, 10) < 10) goto exit_on_error;
-
- c[10] = 0;
-
- if(strncmp(c, "ID3", 3)) goto exit_on_error;
-
- header = XMALLOCD0(id3v2_header, "id3v2_get_tag:header");
- header->version_minor = c[3];
- header->version_revision = c[4];
- header->flags = c[5];
- header->unsyncronization = (c[5] & 128) >> 7;
- header->has_extended_header = (c[5] & 64) >> 6;
- header->is_experimental = (c[5] & 32) >> 5;
- header->has_footer = (c[5] & 16) >> 4;
-
- header->total_tag_size = id3_unsync32(c, 6) + 10;
- if(header->has_footer) header->total_tag_size += 10;
-
- tag = XMALLOCD0(id3v2_tag, "id3v2_get_tag:tag");
-
- /* check if version is supported */
- if(c[3] != 3 && c[3] != 4)
- {
- xfree(c);
- tag->header = header;
- tag->frame_list = NULL;
- return tag;
- }
-
- frame_list = XMALLOCD0(id3v2_frame_list, "id3v2_get_tag:frame_list");
- frame_list->start = frame_list;
-
- /* assigning header and frame list to tag */
- tag->header = header;
- tag->frame_list = frame_list;
-
- if(header->has_extended_header)
- {
- id3v2_extended_header *xt_header = XMALLOCD0(id3v2_extended_header,
- "id3v2_get_tag:id3v2_extended_header");
-
- header->extended_header = xt_header;
-
- read(fd, c, 4); /* get length of extended header */
- xt_header->size = id3_unsync32(c, 0);
-
- read(fd, c, 1); /* get number of flags */
- xt_header->no_flag_bytes = (c[0] > 0) ? c[0] : 1;
-
- read(fd, c, xt_header->no_flag_bytes); /* get flag bytes */
- xt_header->is_update = (c[0] & 64) >> 6;
- xt_header->crc_data_present = (c[0] & 32) >> 5;
- xt_header->restrictions = (c[0] & 16) >> 4;
-
- /* Flag data */
- if(xt_header->is_update) read(fd, c, 1); /* Data length ind. is 0 -skip */
- if(xt_header->crc_data_present) {
- read(fd, c, 1); /* data length - shoud be 5 */
- if(*c != 5) goto exit_on_error; /* else things might
- break badly */
- xt_header->crc_data_length = *c;
- xt_header->crc_data = xmallocd0(*c, "id3v2_get_tag:xt_header->crc_data");
- read(fd, xt_header->crc_data, *c);
- }
- if(xt_header->restrictions) {
- read(fd, c, 1); /* data length - shoud be 1 */
- if(*c != 1) goto exit_on_error;
- xt_header->restrictions_data_length = *c;
- xt_header->restrictions_data = xmallocd0(*c,
- "id3v2_get_tag:xt_header->restrictions_data");
- read(fd, xt_header->restrictions_data, *c);
- }
- }
-
- /* Read frames */
- while(lseek(fd, 0L, SEEK_CUR) < header->total_tag_size)
- {
- int hasEnc = 0, hasLang = 0, d;
-
- read(fd, c, 10); /* Read header */
-
- /* break if padding is reached - this should never happen here.. */
- if(c[0] == 0 && c[1] == 0 && c[2] == 0 && c[3] == 0) break;
-
- /* Check if possible id is alpha numeric */
- if(!isalnum(c[0]) || !isalnum(c[1]) || !isalnum(c[2]) || !isalnum(c[3])) break;
-
- frame = XMALLOCD(id3v2_frame, "id3v2_get_tag:frame");
- frame->frame_id = xmallocd(4, "id3v2_get_tag:frame->frame_id");
- strncpy(frame->frame_id, c, 4);
- frame->data_size = id3_unsync32(c, 4);
- frame->status_flag = c[8];
- frame->format_flag = c[9];
-
- /* Getting frame content */
- frame->data = xmallocd(frame->data_size, "id3v2_get_tag:frame->data_size");
- read(fd, frame->data, frame->data_size);
-
- /* Add frame to list */
- if(frame_list->data)
- {
- frame_list->next = XMALLOCD(id3v2_frame_list, "id3v2_get_tag:frame_list->next");
- frame_list->next->start = frame_list->start;
- frame_list = frame_list->next;
- frame_list->next = NULL;
- }
- frame_list->data = frame;
- }
-
- xfree(c);
- return tag;
-
- exit_on_error:
-
- xfree(c);
- id3v2_free_tag(tag);
- return NULL;
-}
-
-static char **
-id3v2_get_names(id3v2_tag *tag)
-{
- id3v2_frame *frame;
- id3v2_frame_list *frame_list;
- char **clist;
- int i;
-
- if(!tag->frame_list) return NULL;
-
- frame_list = tag->frame_list;
-
- i = id3_get_no_frames(tag);
- clist = xmallocd(sizeof(char*) * i+1, "id3v2_get_names:clist");
- clist[i] = 0;
-
- for(i = 0; frame_list; i++)
- {
- if(!frame_list->data) continue;
- frame = frame_list->data;
-
- if(!frame->frame_id) continue;
- clist[i] = xmallocd(5, "id3v2_get_names:clist[i]");
- strncpy(clist[i], frame->frame_id, 4);
- clist[i][4] = 0;
- frame_list = frame_list->next;
- }
- return clist;
-}
-
-
-static id3_content*
-id3v1_get_content(id3v1_tag *tag, int field)
-{
- int i;
- char *c;
- id3_content *ret;
-
- switch(field)
- {
- case MP_ARTIST:
- if(!tag->artist)
- {
- errno = MP_EFNF;
- return NULL;
- }
- return mp_assemble_text_content(tag->artist, ISO_8859_1);
-
- case MP_TITLE:
- if(!tag->title)
- {
- errno = MP_EFNF;
- return NULL;
- }
- return mp_assemble_text_content(tag->title, ISO_8859_1);
-
- case MP_ALBUM:
- if(!tag->album)
- {
- errno = MP_EFNF;
- return NULL;
- }
- return mp_assemble_text_content(tag->album, ISO_8859_1);
-
- case MP_YEAR:
- if(!tag->year)
- {
- errno = MP_EFNF;
- return NULL;
- }
- return mp_assemble_text_content(tag->year, ISO_8859_1);
-
- case MP_COMMENT:
- if(!tag->comment)
- {
- errno = MP_EFNF;
- return NULL;
- }
- return mp_assemble_comment_content(tag->comment, NULL, ISO_8859_1, NULL);
-
- case MP_GENRE:
- if(tag->genre < GLL)
- {
- return mp_assemble_text_content(genre_list[tag->genre], ISO_8859_1);
- }
- else
- {
- errno = MP_EFNF;
- return NULL;
- }
-
- case MP_TRACK:
- if(!tag->track)
- {
- errno = MP_EFNF;
- return NULL;
- }
-
- if(tag->track < 10) i = 2;
- else if(tag->track < 100) i = 3;
- else i = 4;
- c = xmallocd(i, "id3v1_get_content:c");
- snprintf(c, i, "%d", tag->track);
- ret = mp_assemble_text_content(c, ISO_8859_1);
- xfree(c);
- return ret;
-
- default:
- errno = MP_EFNF;
- return NULL;
- }
-}
-
-static id3_content*
-id3v2_get_content_at_pos(id3v2_tag *tag, const char *field, int pos)
-{
- id3v2_frame_list *frame_list;
- id3v2_frame *frame;
- int i, found, j;
-
- if(!tag->frame_list || !field)
- {
- errno = MP_EERROR;
- return NULL;
- }
-
- frame_list = tag->frame_list;
-
- for(i = 0, found = 0; frame_list; i++, frame_list = frame_list->next)
- {
- if(!frame_list->data) continue;
- frame = frame_list->data;
-
- if(!frame->frame_id || !frame->data) continue;
- if(strncmp(frame->frame_id, field, 4)) continue;
-
- if(found == pos)
- {
- id3_content *ret = XMALLOCD0(id3_content,
- "id3v2_get_content_at_pos:ret");
- if(frame_is_compressed(frame)) ret->compressed = 1;
- else ret->compressed = 0;
-
- if(frame_is_encrypted(frame)) ret->encrypted = 1;
- else ret->encrypted = 0;
-
- ret->length = frame->data_size;
- ret->data = xmallocd(frame->data_size, "id3v2_get_content_at_pos:ret->data");
- ret->data = memcpy(ret->data, frame->data, frame->data_size);
-
- return ret;
- }
-
- found++;
- }
-
- errno = MP_EFNF;
- return NULL;
-}
-
-static long
-id3_sync(unsigned char* data, long length)
-{
- int i;
-
- for(i = 0; i < length - 1; i++)
- {
- if(((data[i] & 0xFF) == 0xFF && (data[i+1] & 0xE0) == 0xE0) ||
- (i+2 < length && (data[i] & 0xFF) == 0xFF && data[i+1] == 0 && data[i+2] != 0))
- {
-
- realloc(data, length + 1); length++;
- memmove(data + i+2, data + i+1, length - i - 2);
- memset(data + i+1, 0, 1);
- }
- }
-
- return length;
-}
-
-static long
-id3_unsync(unsigned char* data, long length)
-{
- /* TODO */
- /* this function is supposed to make syncsafe values normal again */
- /* we don't need this yet, because there are no fields supported that will */
- /* have the unsynchronization scheme applied */
-
-
-}
-
-static unsigned int
-id3_unsync32(unsigned char* c, int start)
-{
- return c[start+3] + (c[start+2] << 7) + (c[start+1] << 14) + (c[start] << 21);
-}
-
-int
-id3_get_no_frames(id3v2_tag *tag)
-{
- int i;
- id3v2_frame_list *frame_list = tag->frame_list;
-
- for(i = 0; frame_list; i++)
- frame_list = frame_list->next;
-
- return i;
-}
-
-static unsigned char *
-id3_sync32(unsigned int i)
-{
- unsigned char *c = (unsigned char *)xmallocd0(4, "id3_sync32:c");
-
- c[3] = (i & 0x7f);
- c[2] = ((i & 0x80) >> 7) | (((i & 0x7f00) >> 8) << 1);
- c[1] = ((i & 0x8000) >> 15) | (((i & 0x7f0000) >> 16) << 1);
- c[0] = ((i & 0x800000) >> 23) | (((i & 0x7f000000) >> 24) << 1);
-
- return c;
-}
-
-id3v2_frame*
-id3_lookup_frame(id3v2_frame_list *list, const char *field, const int pos)
-{
- int cur = 0;
-
- if(!list || !field) return NULL;
-
- do
- {
- if(!strcmp(list->data->frame_id, field))
- {
- if(cur == pos) return list->data;
- cur++;
- }
- } while((list = list->next));
-
- return NULL;
-}
-
-int
-id3_remove_frame(id3v2_frame_list *list, id3v2_frame *frame)
-{
- if(!list || !frame) return MP_EERROR;
-
- /* Frame is first element in list */
- if(list->data == frame)
- {
- xfree(list->data);
- list->next->start = list->next;
- xfree(list);
- return 0;
- }
-
- /* Iterate through others */
- do
- {
- if(list->next->data == frame)
- {
- list->next = list->next->next;
- xfree(frame);
- return 0;
- }
- } while((list = list->next));
-
- return 1;
-}
-
-
-int
-id3_add_frame(id3v2_frame_list *list, char *field, char *new_value, int len)
-{
- id3v2_frame *frame;
- char *new_valuecp;
- long len_sync;
-
- if(!list || !new_value || !field || strlen(field) != 4) return MP_EERROR;
-
- // make a copy of the given value to include it in the frame
- new_valuecp = xmallocd(len,
- "id3_add_frame:new_valuecp");
- memcpy(new_valuecp, new_value, len);
- new_value = new_valuecp;
-
- /* make sync safe */
-/* len_sync = id3_sync(new_value, len); */
- len_sync = len; /* disabled sync for MPIO use */
-
- frame = XMALLOCD(id3v2_frame, "id3_add_frame:frame");
- frame->frame_id = xmallocd(4, "id3_add_frame:frame->frame_id");
- strncpy(frame->frame_id, field, 4);
- frame->data = new_value;
- frame->status_flag = 0;
-
- if(len != len_sync) frame->format_flag = 64;
- else frame->format_flag = 0;
- frame->data_size = len_sync;
-
- /* Empty list */
- if(!list->data)
- {
- list->data = frame;
- return 0;
- }
-
- /* iterate to last element */
- while(list->next) list = list->next;
-
- list->next = XMALLOCD(id3v2_frame_list, "id3_add_frame:list->next");
- list->next->start = list->start;
- list = list->next;
- list->next = NULL;
- list->data = frame;
-
- return 0;
-}
-
-
-#define BUF_SIZE 4096
-
-static int
-id3_lseek_syncword(int fd)
-{
- unsigned char *data = (unsigned char*) xmallocd(BUF_SIZE, "id3_lseek_syncword:data");
- int ret;
-
- // Reset the reading offset of the fd
- lseek(fd, SEEK_SET, 0);
-
- if(read(fd, data, BUF_SIZE) < 1)
- {
- xfree(data);
- return 0; /* return false on EOF */
- }
-
- ret = id3_lseek_syncword_r(fd, data, 0);
- xfree(data);
- return ret;
-}
-
-static int
-id3_lseek_syncword_r(int fd, unsigned char *data, int checked)
-{
- unsigned char lastchar;
- int i;
-
- for(i = 0; i + 1 < BUF_SIZE; i++)
- {
- if(((data[i] & 0xFF)== 0xFF) && ((data[i+1] & 0xE0)== 0xE0))
- {
- lseek(fd, checked + i, SEEK_SET);
- return 0;
- }
- }
-
- lastchar = data[BUF_SIZE - 1];
-
- if(read(fd, data, BUF_SIZE) < 1) return 0; /* return false on EOF */
-
- if(((lastchar & 0xFF)== 0xFF) && ((data[0] & 0xE0)== 0xE0))
- {
- lseek(fd, checked + BUF_SIZE - 1, SEEK_SET);
- return 0;
- }
-
- return id3_lseek_syncword_r(fd, data, checked + BUF_SIZE);
-}
-
-static id3_tag*
-id3v1_alloc_tag(void)
-{
- id3_tag *tag = XMALLOCD(id3_tag, "id3v1_alloc_tag:tag");
- id3v1_tag *v1 = XMALLOCD0(id3v1_tag, "id3v1_alloc_tag:v1");
-
- tag->tag = v1;
- tag->version = 1;
-
- v1->genre = 0xFF;
-
- return tag;
-}
-
-static id3_tag*
-id3v2_alloc_tag(void)
-{
- id3_tag *tag = XMALLOCD(id3_tag, "id3v2_alloc_tag:tag");
- id3v2_tag *v2 = XMALLOCD0(id3v2_tag, "id3v2_alloc_tag:v2");
-
- tag->tag = v2;
- tag->version = 2;
-
- return tag;
-}
-
-static void
-id3v1_free_tag(id3v1_tag* v1)
-{
- xfree(v1->artist);
- xfree(v1->album);
- xfree(v1->title);
- xfree(v1->year);
- xfree(v1->comment);
- xfree(v1);
-}
-
-static void
-id3v2_free_tag(id3v2_tag* v2)
-{
- id3v2_frame_list* doomed;
- id3v2_frame *frame;
-
- if(!v2) return;
-
- xfree(v2->header->extended_header);
- xfree(v2->header);
-
- if(!v2->frame_list)
- {
- xfree(v2);
- return;
- }
-
- /* Freeing frames */
- do
- {
- frame = (id3v2_frame*)v2->frame_list->data;
- if(frame->frame_id) xfree(frame->frame_id);
- if(frame->data) xfree(frame->data);
- xfree(v2->frame_list->data);
-
- doomed = v2->frame_list->next;
- xfree(v2->frame_list);
-
- } while((v2->frame_list = doomed));
-
- xfree(v2);
-}
diff --git a/libmpio/mplib/mplib_s.h b/libmpio/mplib/mplib_s.h
deleted file mode 100644
index 7803a5e..0000000
--- a/libmpio/mplib/mplib_s.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * 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
- */
-
-#include "mplib.h"
-
-#ifndef __MPLIB_S_H
-#define __MPLIB_S_H
-
-#undef __BEGIN_DECLS
-#undef __END_DECLS
-#ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-#else
-# define __BEGIN_DECLS /* empty */
-# define __END_DECLS /* empty */
-#endif
-
-
-__BEGIN_DECLS
-
-
-/************************************/
-/* Members */
-/************************************/
-
-/* Bitrates br_[version]_[layer] ) */
-const static int br_1_1[16] = { -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 };
-const static int br_1_2[16] = { -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 };
-const static int br_1_3[16] = { -1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 };
-const static int br_2_1[16] = { -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 };
-const static int br_2_2[16] = { -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 };
-const static int br_2_3[16] = { -1, 8, 16, 24, 32, 64, 80, 56, 64, 128, 160, 112, 128, 256, 320, 0 };
-
-#define GLL 148
-const static char *genre_list[GLL] =
-{ "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz",
- "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno",
- "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno",
- "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental",
- "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", "Bass", "Soul", "Punk",
- "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave",
- "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy",
- "Cult", "Gangsta Rap", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret",
- "New Wave", "Psychedelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk",
- "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock",
- "National Folk", "Swing", "Fast-Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass",
- "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock",
- "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera",
- "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam",
- "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rythmic Soul", "Freestyle",
- "Duet", "Punk Rock", "Drum Solo", "A Cappella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass",
- "Club-House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat",
- "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian",
- "Christian Rock", "Merengue", "Salsa", "Trash Metal", "Anime", "JPop", "Synthpop" };
-
-
-/************************************/
-/* Macros */
-/************************************/
-
-#define frame_is_read_only(id3v2_frame__) ((id3v2_frame__->status_flag >> 4) & 1)
-#define frame_preserve_on_tag_altered(id3v2_frame__) ((id3v2_frame__->status_flag >> 6) & 1)
-#define frame_preserve_on_file_altered(id3v2_frame__) ((id3v2_frame__->status_flag >> 5) & 1)
-
-#define frame_has_group_information(id3v2_frame__) ((id3v2_frame__->format_flag >> 6) & 1)
-#define frame_is_compressed(id3v2_frame__) ((id3v2_frame__->format_flag >> 3) & 1)
-#define frame_is_encrypted(id3v2_frame__) ((id3v2_frame__->format_flag >> 2) & 1)
-#define frame_is_unsynchronised(id3v2_frame__) ((id3v2_frame__->format_flag >> 1) & 1)
-#define frame_has_data_length_indicator(id3v2_frame__) (id3v2_frame__->format_flag & 1)
-
-
-/************************************/
-/* Static functions */
-/************************************/
-
-
-/* Gets the v1/v2 tag from a file */
-static id3v1_tag *id3v1_get_tag(int);
-static id3v2_tag *id3v2_get_tag(int);
-
-/* Adds v1/v2 Tag to file */
-static int id3v1_add_tag(int, id3v1_tag*);
-static int id3v2_add_tag(int, id3v2_tag*, id3v2_tag*);
-
-/* Removes v1/v2 Tag from file */
-static int id3v1_del_tag(int);
-static int id3v2_del_tag(int, id3v2_tag*);
-
-/* Truncates the fields of the tag to the proper lengths */
-static int id3v1_truncate_tag(id3v1_tag*);
-
-/* Returns 1 or 0 whether arg 1 is just filled up with space (0x20) or not */
-static int id3_is_only_space(char*, int);
-
-/* Gets all frame names available in the tag */
-static char **id3v2_get_names(id3v2_tag*);
-
-/* Gets the content of the given field in the tag on the specified position. */
-static id3_content* id3v2_get_content_at_pos(id3v2_tag*, const char*, int);
-static id3_content* id3v1_get_content(id3v1_tag*, int);
-
-/* Gets the number of available frames */
-static int id3_get_no_frames(id3v2_tag*);
-
-/* Returns string of the frames content */
-/* static char* extract_frame_data(char *, int); */
-
-/* Removes a frame from the frame list */
-static int id3_remove_frame(id3v2_frame_list *, id3v2_frame *);
-
-/* Adds a new frame to the list */
-static int id3_add_frame(id3v2_frame_list *, char *, char *, int);
-
-/* Lookups a frame by his identifier on the given position */
-static id3v2_frame* id3_lookup_frame(id3v2_frame_list *, const char *, const int);
-
-/* Sync functions */
-static long id3_unsync(unsigned char*, long);
-static long id3_sync(unsigned char*, long);
-static unsigned int id3_unsync32(unsigned char*, int);
-static unsigned char* id3_sync32(unsigned int);
-
-static int id3_lseek_syncword(int);
-static int id3_lseek_syncword_r(int, unsigned char *, int);
-
-/* Gets a new allocated v1 or v2 tag */
-static id3_tag* id3v1_alloc_tag(void);
-static id3_tag* id3v2_alloc_tag(void);
-
-/* free functions */
-static void id3v1_free_tag(id3v1_tag*);
-static void id3v2_free_tag(id3v2_tag*);
-
-
-__END_DECLS
-
-#endif /* __MPLIB_S_H */
diff --git a/libmpio/mplib/xmalloc.c b/libmpio/mplib/xmalloc.c
deleted file mode 100644
index a66be63..0000000
--- a/libmpio/mplib/xmalloc.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * 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
- */
-
-#include <sys/types.h>
-#include <stdio.h>
-/* define XMALLOC_CHECK 1 */
-#include "xmalloc.h"
-#ifdef USE_GC
-# include <gc.h>
-# define malloc(str) GC_MALLOC(str)
-#endif
-
-#ifdef XMALLOC_CHECK
-typedef struct _xdelem {
- void* alloced;
- void* freed;
- char* descrl;
- struct _xdelem* next;
-} xdelem;
-
-xdelem* first = NULL;
-#endif
-
-#define errmsg "mplib: Memory exhausted: Could not allocate %d bytes\n"
-
-void *
-xmalloc(size_t s)
-{
- return xmallocd(s, NULL);
-}
-
-void *
-xmallocd(size_t s, char* descrl)
-{
- void *new = (void*)malloc(s);
-#ifdef XMALLOC_CHECK
- xdelem* cur = (xdelem*)malloc(sizeof(xdelem));
- cur->next = NULL;
- cur->freed = NULL;
- cur->descrl = descrl;
-#endif
- if(!new) fprintf(stderr, errmsg, s);
-
-#ifdef XMALLOC_CHECK
- cur->alloced = new;
- exists:
- if(!first) first = cur;
- else {
- xdelem* last = first;
- do {
- if(last->alloced == cur->alloced) {
- last->freed = NULL;
- last->descrl = descrl;
- free(cur);
- goto exists;
- }
- } while(last->next && (last = last->next));
- last->next = cur;
- }
-#endif
-
- return new;
-}
-
-void *
-xmallocd0(size_t s, char* descr)
-{
-#ifdef XMALLOC_CHECK
- void *new = (void*)xmallocd(s, descr);
-#else
- void *new = (void*)malloc(s);
-#endif
- if(!new) fprintf(stderr, errmsg, s);
- else memset(new, 0, s);
- return new;
-}
-
-void *
-xmalloc0(size_t s)
-{
-#ifdef XMALLOC_CHECK
- void *new = (void*)xmalloc(s);
-#else
- void *new = (void*)malloc(s);
-#endif
- if(!new) fprintf(stderr, errmsg, s);
- else memset(new, 0, s);
- return new;
-}
-
-void *
-xrealloc(void * ptr, size_t s)
-{
- void *new;
-
- if(!ptr) return xmalloc(s);
-
- new = (void*)realloc(ptr, s);
- if(!new) fprintf(stderr, errmsg, s);
- return new;
-}
-
-void
-xfree(void* ptr) {
- if(!ptr) return;
-#ifdef XMALLOC_CHECK
- if(first) {
- xdelem* el = first;
- do {
- if(el->freed == ptr) {
- if(el->descrl)
- printf("XMALLOC: (%s) memory allready freed\n", el->descrl);
- else
- printf("XMALLOC: memory allready freed at %h\n", ptr);
- break;
- }
- if(el->alloced == ptr) {
- el->freed = ptr;
- break;
- }
- } while(el->next && (el = el->next));
- }
-#endif
- free(ptr);
-}
-
-
-#ifdef XMALLOC_CHECK
-void
-xprint_malloc_stat(void) {
- long kb_alloc = 0;
- long kb_freed = 0;
- long kb_used = 0;
- int count_used = 0;
- xdelem* el = first;
-
- if(!first) {
- puts("XMALLOC: No statistic available");
- }
- puts("xmalloc statistic:");
- do {
- if(!el->freed) {
- if(el->descrl && !strstr(el->descrl, "ignore"))
- printf("%s (not freed)\n", el->descrl);
- else if(!el->descrl) printf("%p (not freed)\n", el->alloced);
- } else {
- //if(el->descrl) printf("%s (freed)\n", el->descrl);
- //else printf("%p (freed)\n", el->alloced);
- }
- } while(el->next && (el = el->next));
-}
-#endif
diff --git a/libmpio/mplib/xmalloc.h b/libmpio/mplib/xmalloc.h
deleted file mode 100644
index ecdf1b6..0000000
--- a/libmpio/mplib/xmalloc.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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
- */
-
-#ifndef __XMALLOC_H
-#define __XMALLOC_H
-
-/* __BEGIN_DECLS should be used at the beginning of your declarations,
- so that C++ compilers don't mangle their names. Use __END_DECLS at
- the end of C declarations. */
-#undef __BEGIN_DECLS
-#undef __END_DECLS
-#ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-#else
-# define __BEGIN_DECLS /* empty */
-# define __END_DECLS /* empty */
-#endif
-
-
-#define XMALLOC(type) ((type *) xmalloc(sizeof(type)))
-#define XMALLOCD(type,descr) ((type *) xmallocd(sizeof(type),descr))
-#define XMALLOC0(type) ((type *) xmalloc0(sizeof(type)))
-#define XMALLOCD0(type,descr) ((type *) xmallocd0(sizeof(type),descr))
-
-__BEGIN_DECLS
-
-/* define XMALLOC_CHECK 1 */
-
-void *xmalloc(size_t);
-void *xmallocd(size_t, char*);
-void *xmalloc0(size_t);
-void *xmallocd0(size_t, char*);
-void *xrealloc(void *, size_t);
-void *xcalloc(size_t, size_t);
-void xfree(void*);
-#ifdef XMALLOC_CHECK
-void xprint_malloc_stat(void);
-#endif
-
-__END_DECLS
-
-#endif /* __XMALLOC_H */
diff --git a/libmpio/src/id3.c b/libmpio/src/id3.c
deleted file mode 100644
index 88f86c4..0000000
--- a/libmpio/src/id3.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * $Id: id3.c,v 1.5 2006/01/21 18:33:20 germeier Exp $
- *
- * libmpio - a library for accessing Digit@lways MPIO players
- * Copyright (C) 2003 Markus Germeier
- *
- * 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; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * 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.,g 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <unistd.h>
-#include <fcntl.h>
-#include <iconv.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "id3.h"
-#include "debug.h"
-#include "mplib.h"
-#include "mpio.h"
-
-#ifdef MPLIB
-/* local declarations */
-void mpio_id3_get_content(id3_tag *, id3_tag *, int, CHAR[INFO_LINE]);
-void mpio_id3_copy_tag(CHAR *, CHAR *, int *);
-BYTE mpio_id3_get(mpio_t *);
-BYTE mpio_id3_set(mpio_t *, BYTE);
-
-void
-mpio_id3_get_content(id3_tag *tag, id3_tag *tag2, int field,
- CHAR out[INFO_LINE])
-{
- id3_content *content;
- id3_text_content *text_content;
-
- content = mp_get_content(tag, field);
- if (!content)
- content = mp_get_content(tag2, field);
- if (content)
- {
- text_content = mp_parse_artist(content);
- debugn(2, "Found (%d): %s\n", field, text_content->text);
- strncpy(out, text_content->text, INFO_LINE);
- } else {
- strcpy(out,"");
- }
-
-}
-
-void
-mpio_id3_copy_tag(CHAR *src, CHAR *dest, int *offset)
-{
- int i=0;
- int last=0;
-
- /* find last non-space character, so we can strip */
- /* trailing spaces */
- while(src[i])
- if (src[i++]!=0x20)
- last=i;
-
- i=0;
- while((*offset<(INFO_LINE-1)) && (src[i]) && (i<last))
- dest[(*offset)++]=src[i++];
-}
-
-#endif /* MPLIB */
-
-BYTE
-mpio_id3_set(mpio_t *m, BYTE value)
-{
-#ifdef MPLIB
- m->id3 = value;
- return m->id3;
-#else
- return 0;
-#endif /* MPLIB */
-}
-
-/* query ID3 rewriting support */
-BYTE
-mpio_id3_get(mpio_t *m)
-{
-#ifdef MPLIB
- return m->id3;
-#else
- return 0;
-#endif /* MPLIB */
-}
-
-/* ID3 rewriting: do the work */
-/* context, src filename, uniq filename template */
-int
-mpio_id3_do(mpio_t *m, CHAR *src, CHAR *tmp)
-{
-#ifdef MPLIB
- int fd, in;
- BYTE buf[BLOCK_SIZE];
- int r, w;
- int i, j, t;
- id3_tag *tag, *tag2, *new_tag;
- id3_tag_list *tag_list;
- id3_tag_list new_tag_list;
- id3_content new_content;
- id3v2_tag *v2_tag;
- CHAR data_artist[INFO_LINE];
- CHAR data_title[INFO_LINE];
- CHAR data_album[INFO_LINE];
- CHAR data_year[INFO_LINE];
- CHAR data_genre[INFO_LINE];
- CHAR data_comment[INFO_LINE];
- CHAR data_track[INFO_LINE];
-
- CHAR mpio_tag[INFO_LINE];
- char *mpio_tag_unicode;
-
- iconv_t ic;
- size_t fin, fout;
- char *fback, *back;
-
- if (!m->id3)
- return 0;
-
- snprintf(tmp, INFO_LINE, "/tmp/MPIO-XXXXXXXXXXXXXXX");
-
- fd = mkstemp(tmp);
- if (fd==-1) return 0;
- sprintf(m->id3_temp, tmp, INFO_LINE);
-
- in = open(src, O_RDONLY);
- if (in==-1) return 0;
-
- do {
- r=read(in, buf, BLOCK_SIZE);
- if (r>0)
- w=write(fd, buf, r);
- } while (r>0);
-
- close (in);
-
- tag_list = mp_get_tag_list_from_fd(fd);
- if (!tag_list)
- {
- debugn(2, "no tag list found!\n");
- return 0;
- }
-
- tag = tag_list->tag;
- tag2 = NULL;
- if (tag_list->next)
- tag2 = tag_list->next->tag;
-
- /* read tags from file */
- mpio_id3_get_content(tag, tag2, MP_ARTIST, data_artist);
- mpio_id3_get_content(tag, tag2, MP_TITLE, data_title);
- mpio_id3_get_content(tag, tag2, MP_ALBUM, data_album);
- mpio_id3_get_content(tag, tag2, MP_GENRE, data_genre);
- mpio_id3_get_content(tag, tag2, MP_COMMENT, data_comment);
- mpio_id3_get_content(tag, tag2, MP_YEAR, data_year);
- mpio_id3_get_content(tag, tag2, MP_TRACK, data_track);
-
- /* build new tag */
- mpio_tag[0]=0x00;
- i=j=t=0;
-
- while ((t<(INFO_LINE-1) && m->id3_format[i]!=0))
- {
- if (m->id3_format[i] == '%')
- {
- i++;
- switch(m->id3_format[i])
- {
- case 'p':
- mpio_id3_copy_tag(data_artist, mpio_tag, &t);
- break;
- case 't':
- mpio_id3_copy_tag(data_title, mpio_tag, &t);
- break;
- case 'a':
- mpio_id3_copy_tag(data_album, mpio_tag, &t);
- break;
- case 'g':
- mpio_id3_copy_tag(data_genre, mpio_tag, &t);
- break;
- case 'c':
- mpio_id3_copy_tag(data_comment, mpio_tag, &t);
- break;
- case 'y':
- mpio_id3_copy_tag(data_year, mpio_tag, &t);
- break;
- case 'n':
- mpio_id3_copy_tag(data_track, mpio_tag, &t);
- break;
- default:
- mpio_tag[t] = m->id3_format[i];
- }
- } else {
- mpio_tag[t] = m->id3_format[i];
- t++;
- }
-
- i++;
- }
- mpio_tag[t]=0x00;
-
- debugn(2, "new_tag: %s\n", mpio_tag);
-
- /* convert tag to UNICODELITTLE */
- fin = strlen(mpio_tag) + 1;
- fout = fin*2 + 2;
- ic = iconv_open("UNICODELITTLE", "ASCII");
- fback = mpio_tag;
- mpio_tag_unicode = (char *)malloc(2*INFO_LINE+3);
- back = (char *)mpio_tag_unicode;
- *back=0x01;
- back++;
- *back=0xff;
- back++;
- *back=0xfe;
- back++;
-
- debugn(2,"iconv before %s %d %d\n", fback, fin, fout);
- iconv(ic, (char **)&fback, &fin, (char **)&back, &fout);
- debugn(2,"iconv after %s %d %d\n", fback, fin, fout);
- iconv_close(ic);
- hexdumpn(2, mpio_tag, strlen(mpio_tag));
- hexdumpn(2, (char *)mpio_tag_unicode, (2*strlen(mpio_tag))+3);
-
- /* build new ID3 v2 tag with only TXXX field */
- new_content.length=(2*strlen(mpio_tag))+3;
- new_content.data = (char *)malloc(new_content.length);
- new_content.compressed=0;
- new_content.encrypted=0;
- memcpy(new_content.data, mpio_tag_unicode, new_content.length);
-
- new_tag = mp_alloc_tag_with_version (2);
- mp_set_custom_content(new_tag, "TXXX", &new_content);
-
- v2_tag = (id3v2_tag *)new_tag->tag;
- v2_tag->header->unsyncronization=0;
- v2_tag->header->is_experimental=0;
-
- new_tag_list.tag = new_tag;
- new_tag_list.next = NULL;
- new_tag_list.first = NULL;
-
- /* delete ID3 v2 tag from file */
- mp_del_tags_by_ver_from_fd(fd, 2);
- close (fd);
-
- /* write new ID3 v2 tag to file */
- mp_write_to_file(&new_tag_list, tmp);
-
- free(mpio_tag_unicode);
-
- return 1;
-#else
- return 0;
-#endif /* MPLIB */
-}
-
-int
-mpio_id3_end(mpio_t *m)
-{
-#ifdef MPLIB
- if (m->id3_temp[0])
- unlink(m->id3_temp);
- m->id3_temp[0] = 0x00;
- return 1;
-#else
- return 0;
-#endif /* MPLIB */
-}
-
-void
-mpio_id3_format_set(mpio_t *m, CHAR *format)
-{
- strncpy(m->id3_format, format, INFO_LINE);
-}
-
-/* get format string for rewriting*/
-void
-mpio_id3_format_get(mpio_t *m, CHAR *format)
-{
- strncpy(format, m->id3_format, INFO_LINE);
-}
diff --git a/libmpio/src/id3.h b/libmpio/src/id3.h
deleted file mode 100644
index 9ed1080..0000000
--- a/libmpio/src/id3.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * $Id: id3.h,v 1.3 2006/01/21 18:33:20 germeier Exp $
- *
- * libmpio - a library for accessing Digit@lways MPIO players
- * Copyright (C) 2003 Markus Germeier
- *
- * 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; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * 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
- *
- */
-
-#ifndef _MPIO_ID3_H_
-#define _MPIO_ID3_H_
-
-#include "defs.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ID3 rewriting: do the work */
-/* context, src filename, uniq filename template */
-int mpio_id3_do(mpio_t *, CHAR *, CHAR *);
-
-/* ID3: clean up temp file */
-int mpio_id3_end(mpio_t *);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _MPIO_ID3_H_ */
diff --git a/libmpio/src/mpio.c b/libmpio/src/mpio.c
index b17fbd4..101d608 100644
--- a/libmpio/src/mpio.c
+++ b/libmpio/src/mpio.c
@@ -40,7 +40,6 @@
#include "mpio.h"
#include "smartmedia.h"
#include "fat.h"
-#include "id3.h"
void mpio_bail_out(void);
void mpio_init_internal(mpio_t *);
@@ -118,7 +117,7 @@ static const int mpio_error_num = sizeof mpio_errors / sizeof(mpio_error_t);
static int _mpio_errno = 0;
-#define MPIO_ERR_RETURN(err) { mpio_id3_end(m); _mpio_errno = err; return -1 ; }
+#define MPIO_ERR_RETURN(err) { _mpio_errno = err; return -1 ; }
#define MPIO_CHECK_FILENAME(filename) \
if (!mpio_check_filename(filename)) { \
@@ -468,11 +467,6 @@ mpio_init(mpio_callback_init_t progress_callback)
/* set default charset for filename conversion */
new_mpio->charset=strdup(MPIO_CHARSET);
- /* disable ID3 rewriting support */
- new_mpio->id3=0;
- strncpy(new_mpio->id3_format, MPIO_ID3_FORMAT, INFO_LINE);
- new_mpio->id3_temp[0]=0x00;
-
return new_mpio;
}
@@ -761,7 +755,6 @@ mpio_file_put_real(mpio_t *m, mpio_mem_t mem, mpio_filename_t i_filename,
struct stat file_stat;
struct tm tt;
time_t curr;
- int id3;
int block_size;
BYTE *p = NULL;
@@ -786,8 +779,6 @@ mpio_file_put_real(mpio_t *m, mpio_mem_t mem, mpio_filename_t i_filename,
{
fsize=filesize=memory_size;
} else {
- id3 = mpio_id3_do(m, i_filename, use_filename);
- if (!id3)
strncpy(use_filename, i_filename, INFO_LINE);
if (stat((const char *)use_filename, &file_stat)!=0) {
debug("could not find file: %s\n", use_filename);
@@ -979,8 +970,6 @@ mpio_file_put_real(mpio_t *m, mpio_mem_t mem, mpio_filename_t i_filename,
fsize, start, 0x20);
}
- mpio_id3_end(m);
-
return fsize-filesize;
}
diff --git a/mpiosh/callback.c b/mpiosh/callback.c
index 10e5a0a..e98a334 100644
--- a/mpiosh/callback.c
+++ b/mpiosh/callback.c
@@ -297,10 +297,6 @@ mpiosh_cmd_open(char *args[])
if ((mpiosh.dev) && (mpiosh.config->charset))
mpio_charset_set(mpiosh.dev, mpiosh.config->charset);
- if (mpiosh.dev) {
- mpio_id3_set(mpiosh.dev, mpiosh.config->id3_rewriting);
- mpio_id3_format_set(mpiosh.dev, mpiosh.config->id3_format);
- }
}
void
@@ -1246,46 +1242,6 @@ mpiosh_cmd_lmkdir(char *args[])
}
void
-mpiosh_cmd_id3(char *args[])
-{
- BYTE status;
- int n;
-
- MPIOSH_CHECK_CONNECTION_CLOSED;
-
- if (args[0] == NULL) {
- status = mpio_id3_get(mpiosh.dev);
- printf("ID3 rewriting is %s\n", (status?"ON":"OFF"));
- return;
- } else {
- if (!strcmp(args[0], "on")) {
- status = mpio_id3_set(mpiosh.dev, 1);
- } else if (!strcmp(args[0], "off")) {
- status = mpio_id3_set(mpiosh.dev, 0);
- } else {
- fprintf(stderr, "unknown id3 command\n");
- return;
- }
- printf("ID3 rewriting is now %s\n", (status?"ON":"OFF"));
- }
-}
-
-void
-mpiosh_cmd_id3_format(char *args[])
-{
- CHAR format[INFO_LINE];
-
- MPIOSH_CHECK_CONNECTION_CLOSED;
-
- if (args[0] == NULL) {
- mpio_id3_format_get(mpiosh.dev, format);
- printf("current format line: \"%s\"\n", format);
- } else {
- mpio_id3_format_set(mpiosh.dev, args[0]);
- }
-}
-
-void
mpiosh_cmd_font_upload(char *args[])
{
BYTE * p;
diff --git a/mpiosh/global.c b/mpiosh/global.c
index 09a63f3..04fd9e7 100644
--- a/mpiosh/global.c
+++ b/mpiosh/global.c
@@ -125,12 +125,6 @@ struct mpiosh_cmd_t commands[] = {
{ "health", NULL, NULL,
" show the health status from the selected memory",
mpiosh_cmd_health, NULL },
- { "id3", NULL, "[<on|off>]",
- " enable/disable ID3 rewriting support",
- mpiosh_cmd_id3, mpiosh_readline_comp_onoff },
- { "id3_format", NULL, "[<format>]",
- " define/show the format line for ID3 rewriting",
- mpiosh_cmd_id3_format, NULL },
{ "font_upload", NULL, "[<fontfile>]",
" upload the give fontfile to the internal memory",
mpiosh_cmd_font_upload, NULL },
diff --git a/mpiosh/mpiosh.c b/mpiosh/mpiosh.c
index 7a5370a..e74278d 100644
--- a/mpiosh/mpiosh.c
+++ b/mpiosh/mpiosh.c
@@ -66,10 +66,6 @@ mpiosh_init(void)
if ((mpiosh.dev) && (mpiosh.config->charset))
mpio_charset_set(mpiosh.dev, mpiosh.config->charset);
- if (mpiosh.dev) {
- mpio_id3_set(mpiosh.dev, mpiosh.config->id3_rewriting);
- mpio_id3_format_set(mpiosh.dev, mpiosh.config->id3_format);
- }
}
void