Mercurial > audlegacy
annotate Plugins/Input/mpg123/id3_frame_content.c @ 227:539a0fa7f030 trunk
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
- Fixes UTF16 to UTF8 down-conversion.
- Fixes length management of UTF8 entities.
- Doesn't break ASCII support.
- Corrects several issues with the original implementation.
author | nenolod |
---|---|
date | Fri, 25 Nov 2005 20:23:40 -0800 |
parents | fa848bd484d8 |
children | 08973a746a3e |
rev | line source |
---|---|
61 | 1 /********************************************************************* |
2 * | |
3 * Copyright (C) 1999, 2002, Espen Skoglund | |
4 * Department of Computer Science, University of Tromsų | |
5 * | |
6 * Filename: id3_frame_content.c | |
7 * Description: Code for handling ID3 content frames. | |
8 * Author: Espen Skoglund <espensk@stud.cs.uit.no> | |
9 * Created at: Mon Feb 8 17:13:46 1999 | |
10 * | |
11 * $Id: id3_frame_content.c,v 1.7 2004/07/20 21:47:22 descender Exp $ | |
12 * | |
13 * This program is free software; you can redistribute it and/or | |
14 * modify it under the terms of the GNU General Public License | |
15 * as published by the Free Software Foundation; either version 2 | |
16 * of the License, or (at your option) any later version. | |
17 * | |
18 * This program is distributed in the hope that it will be useful, | |
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 * GNU General Public License for more details. | |
22 * | |
23 * You should have received a copy of the GNU General Public License | |
24 * along with this program; if not, write to the Free Software | |
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
26 * | |
27 ********************************************************************/ | |
28 | |
29 #include <glib.h> | |
30 #include <glib/gi18n.h> | |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
31 #include <string.h> |
61 | 32 |
33 #include "xmms-id3.h" | |
34 | |
35 #include "mpg123.h" | |
36 | |
37 | |
38 /* | |
39 * Function id3_get_content (frame) | |
40 * | |
41 * Expand content type string of frame and return it. Return NULL | |
42 * upon error. | |
43 * | |
44 */ | |
45 char * | |
46 id3_get_content(struct id3_frame *frame) | |
47 { | |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
48 gchar *text, *text_it; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
49 |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
50 /* Type check */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
51 if (frame->fr_desc->fd_id != ID3_TCON) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
52 return NULL; |
61 | 53 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
54 /* Check if frame is compressed */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
55 if (id3_decompress_frame(frame) == -1) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
56 return NULL; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
57 |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
58 ID3_FRAME_DEFINE_CURSOR(frame); |
61 | 59 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
60 guint8 encoding; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
61 ID3_FRAME_READ_OR_RETVAL(encoding, NULL); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
62 |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
63 text = text_it = id3_string_decode(encoding, cursor, length); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
64 |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
65 if (text == NULL) |
61 | 66 return NULL; |
67 | |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
68 /* |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
69 * Expand ID3v1 genre numbers. |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
70 */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
71 while ((text_it = strstr(text_it, "(")) != NULL) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
72 { |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
73 gchar* replace = NULL; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
74 gchar* ref_start = text_it + 1; |
61 | 75 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
76 if (*ref_start == ')') |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
77 { |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
78 /* False alarm */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
79 ++text_it; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
80 continue; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
81 } |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
82 |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
83 gsize ref_size = strstr(ref_start, ")") - ref_start; |
61 | 84 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
85 if (strncmp(ref_start, "RX", ref_size) == 0) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
86 { |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
87 replace = _("Remix"); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
88 } |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
89 else if (strncmp(ref_start, "CR", ref_size) == 0) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
90 { |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
91 replace = _("Cover"); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
92 } |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
93 else |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
94 { |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
95 /* Maybe an ID3v1 genre? */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
96 int genre_number; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
97 gchar* genre_number_str = g_strndup(ref_start, ref_size); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
98 if (sscanf(genre_number_str, "%d", &genre_number) > 0) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
99 { |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
100 /* Boundary check */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
101 if (genre_number >= sizeof(mpg123_id3_genres) / sizeof(char *)) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
102 continue; |
61 | 103 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
104 replace = gettext(mpg123_id3_genres[genre_number]); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
105 } |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
106 } |
61 | 107 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
108 if (replace != NULL) |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
109 { |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
110 /* Amazingly hairy code to replace a part of the original genre string |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
111 with 'replace'. */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
112 gchar* copy = g_malloc(strlen(text) - ref_size + strlen(replace) + 1); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
113 gsize pos = 0; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
114 gsize copy_size; |
61 | 115 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
116 /* Copy the part before the replaced part */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
117 copy_size = ref_start - text; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
118 memcpy(copy + pos, text, copy_size); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
119 pos += copy_size; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
120 /* Copy the replacement instead of the original reference */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
121 copy_size = strlen(replace); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
122 memcpy(copy + pos, replace, copy_size); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
123 pos += copy_size; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
124 /* Copy the rest, including the null */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
125 memcpy(copy + pos, ref_start + ref_size, strlen(ref_start + ref_size)+1); |
61 | 126 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
127 /* Put into original variables */ |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
128 gsize offset = text_it - text; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
129 g_free(text); |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
130 text = copy; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
131 text_it = text + offset; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
132 } |
61 | 133 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
134 ++text_it; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
135 } |
61 | 136 |
227
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
137 return text; |
539a0fa7f030
[svn] Unicode support fixes, based on an XMMS patch written by Ilya Konstantinov. <ikonst@users.sourceforge.net>:
nenolod
parents:
61
diff
changeset
|
138 |
61 | 139 } |