annotate src/libid3tag-0.15.1b/ucs4.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 * libid3tag - ID3 tag manipulation library
Chris@0 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
Chris@0 4 *
Chris@0 5 * This program is free software; you can redistribute it and/or modify
Chris@0 6 * it under the terms of the GNU General Public License as published by
Chris@0 7 * the Free Software Foundation; either version 2 of the License, or
Chris@0 8 * (at your option) any later version.
Chris@0 9 *
Chris@0 10 * This program is distributed in the hope that it will be useful,
Chris@0 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 13 * GNU General Public License for more details.
Chris@0 14 *
Chris@0 15 * You should have received a copy of the GNU General Public License
Chris@0 16 * along with this program; if not, write to the Free Software
Chris@0 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Chris@0 18 *
Chris@0 19 * $Id: ucs4.c,v 1.13 2004/01/23 09:41:32 rob Exp $
Chris@0 20 */
Chris@0 21
Chris@0 22 # ifdef HAVE_CONFIG_H
Chris@0 23 # include "config.h"
Chris@0 24 # endif
Chris@0 25
Chris@0 26 # include "global.h"
Chris@0 27
Chris@0 28 # include <stdlib.h>
Chris@0 29
Chris@0 30 # include "id3tag.h"
Chris@0 31 # include "ucs4.h"
Chris@0 32 # include "latin1.h"
Chris@0 33 # include "utf16.h"
Chris@0 34 # include "utf8.h"
Chris@0 35
Chris@0 36 id3_ucs4_t const id3_ucs4_empty[] = { 0 };
Chris@0 37
Chris@0 38 /*
Chris@0 39 * NAME: ucs4->length()
Chris@0 40 * DESCRIPTION: return the number of ucs4 chars represented by a ucs4 string
Chris@0 41 */
Chris@0 42 id3_length_t id3_ucs4_length(id3_ucs4_t const *ucs4)
Chris@0 43 {
Chris@0 44 id3_ucs4_t const *ptr = ucs4;
Chris@0 45
Chris@0 46 while (*ptr)
Chris@0 47 ++ptr;
Chris@0 48
Chris@0 49 return ptr - ucs4;
Chris@0 50 }
Chris@0 51
Chris@0 52 /*
Chris@0 53 * NAME: ucs4->size()
Chris@0 54 * DESCRIPTION: return the encoding size of a ucs4 string
Chris@0 55 */
Chris@0 56 id3_length_t id3_ucs4_size(id3_ucs4_t const *ucs4)
Chris@0 57 {
Chris@0 58 return id3_ucs4_length(ucs4) + 1;
Chris@0 59 }
Chris@0 60
Chris@0 61 /*
Chris@0 62 * NAME: ucs4->latin1size()
Chris@0 63 * DESCRIPTION: return the encoding size of a latin1-encoded ucs4 string
Chris@0 64 */
Chris@0 65 id3_length_t id3_ucs4_latin1size(id3_ucs4_t const *ucs4)
Chris@0 66 {
Chris@0 67 return id3_ucs4_size(ucs4);
Chris@0 68 }
Chris@0 69
Chris@0 70 /*
Chris@0 71 * NAME: ucs4->utf16size()
Chris@0 72 * DESCRIPTION: return the encoding size of a utf16-encoded ucs4 string
Chris@0 73 */
Chris@0 74 id3_length_t id3_ucs4_utf16size(id3_ucs4_t const *ucs4)
Chris@0 75 {
Chris@0 76 id3_length_t size = 0;
Chris@0 77
Chris@0 78 while (*ucs4) {
Chris@0 79 ++size;
Chris@0 80 if (*ucs4 >= 0x00010000L &&
Chris@0 81 *ucs4 <= 0x0010ffffL)
Chris@0 82 ++size;
Chris@0 83
Chris@0 84 ++ucs4;
Chris@0 85 }
Chris@0 86
Chris@0 87 return size + 1;
Chris@0 88 }
Chris@0 89
Chris@0 90 /*
Chris@0 91 * NAME: ucs4->utf8size()
Chris@0 92 * DESCRIPTION: return the encoding size of a utf8-encoded ucs4 string
Chris@0 93 */
Chris@0 94 id3_length_t id3_ucs4_utf8size(id3_ucs4_t const *ucs4)
Chris@0 95 {
Chris@0 96 id3_length_t size = 0;
Chris@0 97
Chris@0 98 while (*ucs4) {
Chris@0 99 if (*ucs4 <= 0x0000007fL)
Chris@0 100 size += 1;
Chris@0 101 else if (*ucs4 <= 0x000007ffL)
Chris@0 102 size += 2;
Chris@0 103 else if (*ucs4 <= 0x0000ffffL)
Chris@0 104 size += 3;
Chris@0 105 else if (*ucs4 <= 0x001fffffL)
Chris@0 106 size += 4;
Chris@0 107 else if (*ucs4 <= 0x03ffffffL)
Chris@0 108 size += 5;
Chris@0 109 else if (*ucs4 <= 0x7fffffffL)
Chris@0 110 size += 6;
Chris@0 111 else
Chris@0 112 size += 2; /* based on U+00B7 replacement char */
Chris@0 113
Chris@0 114 ++ucs4;
Chris@0 115 }
Chris@0 116
Chris@0 117 return size + 1;
Chris@0 118 }
Chris@0 119
Chris@0 120 /*
Chris@0 121 * NAME: ucs4->latin1duplicate()
Chris@0 122 * DESCRIPTION: duplicate and encode a ucs4 string into latin1
Chris@0 123 */
Chris@0 124 id3_latin1_t *id3_ucs4_latin1duplicate(id3_ucs4_t const *ucs4)
Chris@0 125 {
Chris@0 126 id3_latin1_t *latin1;
Chris@0 127
Chris@0 128 latin1 = malloc(id3_ucs4_latin1size(ucs4) * sizeof(*latin1));
Chris@0 129 if (latin1)
Chris@0 130 id3_latin1_encode(latin1, ucs4);
Chris@0 131
Chris@0 132 return release(latin1);
Chris@0 133 }
Chris@0 134
Chris@0 135 /*
Chris@0 136 * NAME: ucs4->utf16duplicate()
Chris@0 137 * DESCRIPTION: duplicate and encode a ucs4 string into utf16
Chris@0 138 */
Chris@0 139 id3_utf16_t *id3_ucs4_utf16duplicate(id3_ucs4_t const *ucs4)
Chris@0 140 {
Chris@0 141 id3_utf16_t *utf16;
Chris@0 142
Chris@0 143 utf16 = malloc(id3_ucs4_utf16size(ucs4) * sizeof(*utf16));
Chris@0 144 if (utf16)
Chris@0 145 id3_utf16_encode(utf16, ucs4);
Chris@0 146
Chris@0 147 return release(utf16);
Chris@0 148 }
Chris@0 149
Chris@0 150 /*
Chris@0 151 * NAME: ucs4->utf8duplicate()
Chris@0 152 * DESCRIPTION: duplicate and encode a ucs4 string into utf8
Chris@0 153 */
Chris@0 154 id3_utf8_t *id3_ucs4_utf8duplicate(id3_ucs4_t const *ucs4)
Chris@0 155 {
Chris@0 156 id3_utf8_t *utf8;
Chris@0 157
Chris@0 158 utf8 = malloc(id3_ucs4_utf8size(ucs4) * sizeof(*utf8));
Chris@0 159 if (utf8)
Chris@0 160 id3_utf8_encode(utf8, ucs4);
Chris@0 161
Chris@0 162 return release(utf8);
Chris@0 163 }
Chris@0 164
Chris@0 165 /*
Chris@0 166 * NAME: ucs4->copy()
Chris@0 167 * DESCRIPTION: copy a ucs4 string
Chris@0 168 */
Chris@0 169 void id3_ucs4_copy(id3_ucs4_t *dest, id3_ucs4_t const *src)
Chris@0 170 {
Chris@0 171 while ((*dest++ = *src++))
Chris@0 172 ;
Chris@0 173 }
Chris@0 174
Chris@0 175 /*
Chris@0 176 * NAME: ucs4->duplicate()
Chris@0 177 * DESCRIPTION: duplicate a ucs4 string
Chris@0 178 */
Chris@0 179 id3_ucs4_t *id3_ucs4_duplicate(id3_ucs4_t const *src)
Chris@0 180 {
Chris@0 181 id3_ucs4_t *ucs4;
Chris@0 182
Chris@0 183 ucs4 = malloc(id3_ucs4_size(src) * sizeof(*ucs4));
Chris@0 184 if (ucs4)
Chris@0 185 id3_ucs4_copy(ucs4, src);
Chris@0 186
Chris@0 187 return ucs4;
Chris@0 188 }
Chris@0 189
Chris@0 190 /*
Chris@0 191 * NAME: ucs4->putnumber()
Chris@0 192 * DESCRIPTION: write a ucs4 string containing a (positive) decimal number
Chris@0 193 */
Chris@0 194 void id3_ucs4_putnumber(id3_ucs4_t *ucs4, unsigned long number)
Chris@0 195 {
Chris@0 196 int digits[10], *digit;
Chris@0 197
Chris@0 198 digit = digits;
Chris@0 199
Chris@0 200 do {
Chris@0 201 *digit++ = number % 10;
Chris@0 202 number /= 10;
Chris@0 203 }
Chris@0 204 while (number);
Chris@0 205
Chris@0 206 while (digit != digits)
Chris@0 207 *ucs4++ = '0' + *--digit;
Chris@0 208
Chris@0 209 *ucs4 = 0;
Chris@0 210 }
Chris@0 211
Chris@0 212 /*
Chris@0 213 * NAME: ucs4->getnumber()
Chris@0 214 * DESCRIPTION: read a ucs4 string containing a (positive) decimal number
Chris@0 215 */
Chris@0 216 unsigned long id3_ucs4_getnumber(id3_ucs4_t const *ucs4)
Chris@0 217 {
Chris@0 218 unsigned long number = 0;
Chris@0 219
Chris@0 220 while (*ucs4 >= '0' && *ucs4 <= '9')
Chris@0 221 number = 10 * number + (*ucs4++ - '0');
Chris@0 222
Chris@0 223 return number;
Chris@0 224 }