diff options
| -rw-r--r-- | libmpio/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | libmpio/mplib/mplib.c | 1011 | ||||
| -rw-r--r-- | libmpio/mplib/mplib.h | 438 | ||||
| -rw-r--r-- | libmpio/mplib/mplib_paas.c | 256 | ||||
| -rw-r--r-- | libmpio/mplib/mplib_s.c | 1177 | ||||
| -rw-r--r-- | libmpio/mplib/mplib_s.h | 153 | ||||
| -rw-r--r-- | libmpio/mplib/xmalloc.c | 167 | ||||
| -rw-r--r-- | libmpio/mplib/xmalloc.h | 58 | ||||
| -rw-r--r-- | libmpio/src/id3.c | 298 | ||||
| -rw-r--r-- | libmpio/src/id3.h | 44 | ||||
| -rw-r--r-- | libmpio/src/mpio.c | 13 | ||||
| -rw-r--r-- | mpiosh/callback.c | 44 | ||||
| -rw-r--r-- | mpiosh/global.c | 6 | ||||
| -rw-r--r-- | mpiosh/mpiosh.c | 4 | 
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 | 
