annotate src/libid3tag/utf8.c @ 2503:10692383c103 trunk

[svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
author yaz
date Sun, 11 Feb 2007 05:19:07 -0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
1 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
2 * libid3tag - ID3 tag manipulation library
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
4 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
8 * (at your option) any later version.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
9 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
13 * GNU General Public License for more details.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
14 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
16 * along with this program; if not, write to the Free Software
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
18 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
19 * $Id: utf8.c,v 1.9 2004/01/23 09:41:32 rob Exp $
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
20 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
21
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
22 # ifdef HAVE_CONFIG_H
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
23 # include "config.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
24 # endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
25
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
26 # include "global.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
27
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
28 # include <stdlib.h>
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
29
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
30 # include "id3tag.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
31 # include "utf8.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
32 # include "ucs4.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
33
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
34 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
35 * NAME: utf8->length()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
36 * DESCRIPTION: return the number of ucs4 chars represented by a utf8 string
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
37 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
38 id3_length_t id3_utf8_length(id3_utf8_t const *utf8)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
39 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
40 id3_length_t length = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
41
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
42 while (*utf8) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
43 if ((utf8[0] & 0x80) == 0x00)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
44 ++length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
45 else if ((utf8[0] & 0xe0) == 0xc0 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
46 (utf8[1] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
47 if (((utf8[0] & 0x1fL) << 6) >= 0x00000080L) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
48 ++length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
49 utf8 += 1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
50 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
51 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
52 else if ((utf8[0] & 0xf0) == 0xe0 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
53 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
54 (utf8[2] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
55 if ((((utf8[0] & 0x0fL) << 12) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
56 ((utf8[1] & 0x3fL) << 6)) >= 0x00000800L) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
57 ++length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
58 utf8 += 2;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
59 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
60 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
61 else if ((utf8[0] & 0xf8) == 0xf0 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
62 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
63 (utf8[2] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
64 (utf8[3] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
65 if ((((utf8[0] & 0x07L) << 18) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
66 ((utf8[1] & 0x3fL) << 12)) >= 0x00010000L) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
67 ++length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
68 utf8 += 3;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
69 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
70 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
71 else if ((utf8[0] & 0xfc) == 0xf8 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
72 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
73 (utf8[2] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
74 (utf8[3] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
75 (utf8[4] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
76 if ((((utf8[0] & 0x03L) << 24) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
77 ((utf8[0] & 0x3fL) << 18)) >= 0x00200000L) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
78 ++length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
79 utf8 += 4;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
80 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
81 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
82 else if ((utf8[0] & 0xfe) == 0xfc &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
83 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
84 (utf8[2] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
85 (utf8[3] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
86 (utf8[4] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
87 (utf8[5] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
88 if ((((utf8[0] & 0x01L) << 30) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
89 ((utf8[0] & 0x3fL) << 24)) >= 0x04000000L) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
90 ++length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
91 utf8 += 5;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
92 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
93 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
94
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
95 ++utf8;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
96 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
97
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
98 return length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
99 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
100
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
101 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
102 * NAME: utf8->size()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
103 * DESCRIPTION: return the encoding size of a utf8 string
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
104 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
105 id3_length_t id3_utf8_size(id3_utf8_t const *utf8)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
106 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
107 id3_utf8_t const *ptr = utf8;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
108
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
109 while (*ptr)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
110 ++ptr;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
111
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
112 return ptr - utf8 + 1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
113 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
114
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
115 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
116 * NAME: utf8->ucs4duplicate()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
117 * DESCRIPTION: duplicate and decode a utf8 string into ucs4
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
118 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
119 id3_ucs4_t *id3_utf8_ucs4duplicate(id3_utf8_t const *utf8)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
120 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
121 id3_ucs4_t *ucs4;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
122
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
123 ucs4 = malloc((id3_utf8_length(utf8) + 1) * sizeof(*ucs4));
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
124 if (ucs4)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
125 id3_utf8_decode(utf8, ucs4);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
126
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
127 return release(ucs4);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
128 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
129
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
130 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
131 * NAME: utf8->decodechar()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
132 * DESCRIPTION: decode a series of utf8 chars into a single ucs4 char
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
133 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
134 id3_length_t id3_utf8_decodechar(id3_utf8_t const *utf8, id3_ucs4_t *ucs4)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
135 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
136 id3_utf8_t const *start = utf8;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
137
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
138 while (1) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
139 if ((utf8[0] & 0x80) == 0x00) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
140 *ucs4 = utf8[0];
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
141 return utf8 - start + 1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
142 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
143 else if ((utf8[0] & 0xe0) == 0xc0 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
144 (utf8[1] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
145 *ucs4 =
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
146 ((utf8[0] & 0x1fL) << 6) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
147 ((utf8[1] & 0x3fL) << 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
148 if (*ucs4 >= 0x00000080L)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
149 return utf8 - start + 2;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
150 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
151 else if ((utf8[0] & 0xf0) == 0xe0 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
152 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
153 (utf8[2] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
154 *ucs4 =
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
155 ((utf8[0] & 0x0fL) << 12) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
156 ((utf8[1] & 0x3fL) << 6) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
157 ((utf8[2] & 0x3fL) << 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
158 if (*ucs4 >= 0x00000800L)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
159 return utf8 - start + 3;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
160 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
161 else if ((utf8[0] & 0xf8) == 0xf0 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
162 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
163 (utf8[2] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
164 (utf8[3] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
165 *ucs4 =
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
166 ((utf8[0] & 0x07L) << 18) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
167 ((utf8[1] & 0x3fL) << 12) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
168 ((utf8[2] & 0x3fL) << 6) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
169 ((utf8[3] & 0x3fL) << 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
170 if (*ucs4 >= 0x00010000L)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
171 return utf8 - start + 4;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
172 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
173 else if ((utf8[0] & 0xfc) == 0xf8 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
174 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
175 (utf8[2] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
176 (utf8[3] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
177 (utf8[4] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
178 *ucs4 =
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
179 ((utf8[0] & 0x03L) << 24) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
180 ((utf8[1] & 0x3fL) << 18) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
181 ((utf8[2] & 0x3fL) << 12) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
182 ((utf8[3] & 0x3fL) << 6) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
183 ((utf8[4] & 0x3fL) << 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
184 if (*ucs4 >= 0x00200000L)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
185 return utf8 - start + 5;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
186 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
187 else if ((utf8[0] & 0xfe) == 0xfc &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
188 (utf8[1] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
189 (utf8[2] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
190 (utf8[3] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
191 (utf8[4] & 0xc0) == 0x80 &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
192 (utf8[5] & 0xc0) == 0x80) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
193 *ucs4 =
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
194 ((utf8[0] & 0x01L) << 30) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
195 ((utf8[1] & 0x3fL) << 24) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
196 ((utf8[2] & 0x3fL) << 18) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
197 ((utf8[3] & 0x3fL) << 12) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
198 ((utf8[4] & 0x3fL) << 6) |
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
199 ((utf8[5] & 0x3fL) << 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
200 if (*ucs4 >= 0x04000000L)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
201 return utf8 - start + 6;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
202 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
203
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
204 ++utf8;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
205 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
206 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
207
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
208 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
209 * NAME: utf8->encodechar()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
210 * DESCRIPTION: encode a single ucs4 char into a series of up to 6 utf8 chars
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
211 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
212 id3_length_t id3_utf8_encodechar(id3_utf8_t *utf8, id3_ucs4_t ucs4)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
213 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
214 if (ucs4 <= 0x0000007fL) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
215 utf8[0] = ucs4;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
216
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
217 return 1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
218 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
219 else if (ucs4 <= 0x000007ffL) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
220 utf8[0] = 0xc0 | ((ucs4 >> 6) & 0x1f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
221 utf8[1] = 0x80 | ((ucs4 >> 0) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
222
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
223 return 2;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
224 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
225 else if (ucs4 <= 0x0000ffffL) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
226 utf8[0] = 0xe0 | ((ucs4 >> 12) & 0x0f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
227 utf8[1] = 0x80 | ((ucs4 >> 6) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
228 utf8[2] = 0x80 | ((ucs4 >> 0) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
229
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
230 return 3;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
231 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
232 else if (ucs4 <= 0x001fffffL) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
233 utf8[0] = 0xf0 | ((ucs4 >> 18) & 0x07);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
234 utf8[1] = 0x80 | ((ucs4 >> 12) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
235 utf8[2] = 0x80 | ((ucs4 >> 6) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
236 utf8[3] = 0x80 | ((ucs4 >> 0) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
237
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
238 return 4;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
239 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
240 else if (ucs4 <= 0x03ffffffL) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
241 utf8[0] = 0xf8 | ((ucs4 >> 24) & 0x03);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
242 utf8[1] = 0x80 | ((ucs4 >> 18) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
243 utf8[2] = 0x80 | ((ucs4 >> 12) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
244 utf8[3] = 0x80 | ((ucs4 >> 6) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
245 utf8[4] = 0x80 | ((ucs4 >> 0) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
246
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
247 return 5;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
248 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
249 else if (ucs4 <= 0x7fffffffL) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
250 utf8[0] = 0xfc | ((ucs4 >> 30) & 0x01);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
251 utf8[1] = 0x80 | ((ucs4 >> 24) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
252 utf8[2] = 0x80 | ((ucs4 >> 18) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
253 utf8[3] = 0x80 | ((ucs4 >> 12) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
254 utf8[4] = 0x80 | ((ucs4 >> 6) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
255 utf8[5] = 0x80 | ((ucs4 >> 0) & 0x3f);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
256
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
257 return 6;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
258 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
259
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
260 /* default */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
261
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
262 return id3_utf8_encodechar(utf8, ID3_UCS4_REPLACEMENTCHAR);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
263 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
264
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
265 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
266 * NAME: utf8->decode()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
267 * DESCRIPTION: decode a complete utf8 string into a ucs4 string
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
268 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
269 void id3_utf8_decode(id3_utf8_t const *utf8, id3_ucs4_t *ucs4)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
270 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
271 do
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
272 utf8 += id3_utf8_decodechar(utf8, ucs4);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
273 while (*ucs4++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
274 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
275
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
276 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
277 * NAME: utf8->encode()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
278 * DESCRIPTION: encode a complete ucs4 string into a utf8 string
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
279 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
280 void id3_utf8_encode(id3_utf8_t *utf8, id3_ucs4_t const *ucs4)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
281 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
282 do
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
283 utf8 += id3_utf8_encodechar(utf8, *ucs4);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
284 while (*ucs4++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
285 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
286
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
287 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
288 * NAME: utf8->put()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
289 * DESCRIPTION: serialize a single utf8 character
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
290 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
291 id3_length_t id3_utf8_put(id3_byte_t **ptr, id3_utf8_t utf8)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
292 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
293 if (ptr)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
294 *(*ptr)++ = utf8;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
295
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
296 return 1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
297 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
298
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
299 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
300 * NAME: utf8->get()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
301 * DESCRIPTION: deserialize a single utf8 character
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
302 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
303 id3_utf8_t id3_utf8_get(id3_byte_t const **ptr)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
304 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
305 return *(*ptr)++;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
306 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
307
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
308 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
309 * NAME: utf8->serialize()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
310 * DESCRIPTION: serialize a ucs4 string using utf8 encoding
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
311 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
312 id3_length_t id3_utf8_serialize(id3_byte_t **ptr, id3_ucs4_t const *ucs4,
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
313 int terminate)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
314 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
315 id3_length_t size = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
316 id3_utf8_t utf8[6], *out;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
317
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
318 while (*ucs4) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
319 switch (id3_utf8_encodechar(out = utf8, *ucs4++)) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
320 case 6: size += id3_utf8_put(ptr, *out++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
321 case 5: size += id3_utf8_put(ptr, *out++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
322 case 4: size += id3_utf8_put(ptr, *out++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
323 case 3: size += id3_utf8_put(ptr, *out++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
324 case 2: size += id3_utf8_put(ptr, *out++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
325 case 1: size += id3_utf8_put(ptr, *out++);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
326 case 0: break;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
327 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
328 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
329
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
330 if (terminate)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
331 size += id3_utf8_put(ptr, 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
332
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
333 return size;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
334 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
335
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
336 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
337 * NAME: utf8->deserialize()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
338 * DESCRIPTION: deserialize a ucs4 string using utf8 encoding
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
339 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
340 id3_ucs4_t *id3_utf8_deserialize(id3_byte_t const **ptr, id3_length_t length)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
341 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
342 id3_byte_t const *end;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
343 id3_utf8_t *utf8ptr, *utf8;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
344 id3_ucs4_t *ucs4;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
345
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
346 end = *ptr + length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
347
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
348 utf8 = malloc((length + 1) * sizeof(*utf8));
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
349 if (utf8 == 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
350 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
351
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
352 utf8ptr = utf8;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
353 while (end - *ptr > 0 && (*utf8ptr = id3_utf8_get(ptr)))
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
354 ++utf8ptr;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
355
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
356 *utf8ptr = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
357
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
358 ucs4 = malloc((id3_utf8_length(utf8) + 1) * sizeof(*ucs4));
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
359 if (ucs4)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
360 id3_utf8_decode(utf8, ucs4);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
361
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
362 free(utf8);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
363
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
364 return ucs4;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
365 }