annotate src/libid3tag-0.15.1b/latin1.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: latin1.c,v 1.10 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 "latin1.h"
Chris@0 32 # include "ucs4.h"
Chris@0 33
Chris@0 34 /*
Chris@0 35 * NAME: latin1->length()
Chris@0 36 * DESCRIPTION: return the number of ucs4 chars represented by a latin1 string
Chris@0 37 */
Chris@0 38 id3_length_t id3_latin1_length(id3_latin1_t const *latin1)
Chris@0 39 {
Chris@0 40 id3_latin1_t const *ptr = latin1;
Chris@0 41
Chris@0 42 while (*ptr)
Chris@0 43 ++ptr;
Chris@0 44
Chris@0 45 return ptr - latin1;
Chris@0 46 }
Chris@0 47
Chris@0 48 /*
Chris@0 49 * NAME: latin1->size()
Chris@0 50 * DESCRIPTION: return the encoding size of a latin1 string
Chris@0 51 */
Chris@0 52 id3_length_t id3_latin1_size(id3_latin1_t const *latin1)
Chris@0 53 {
Chris@0 54 return id3_latin1_length(latin1) + 1;
Chris@0 55 }
Chris@0 56
Chris@0 57 /*
Chris@0 58 * NAME: latin1->copy()
Chris@0 59 * DESCRIPTION: copy a latin1 string
Chris@0 60 */
Chris@0 61 void id3_latin1_copy(id3_latin1_t *dest, id3_latin1_t const *src)
Chris@0 62 {
Chris@0 63 while ((*dest++ = *src++))
Chris@0 64 ;
Chris@0 65 }
Chris@0 66
Chris@0 67 /*
Chris@0 68 * NAME: latin1->duplicate()
Chris@0 69 * DESCRIPTION: duplicate a latin1 string
Chris@0 70 */
Chris@0 71 id3_latin1_t *id3_latin1_duplicate(id3_latin1_t const *src)
Chris@0 72 {
Chris@0 73 id3_latin1_t *latin1;
Chris@0 74
Chris@0 75 latin1 = malloc(id3_latin1_size(src) * sizeof(*latin1));
Chris@0 76 if (latin1)
Chris@0 77 id3_latin1_copy(latin1, src);
Chris@0 78
Chris@0 79 return latin1;
Chris@0 80 }
Chris@0 81
Chris@0 82 /*
Chris@0 83 * NAME: latin1->ucs4duplicate()
Chris@0 84 * DESCRIPTION: duplicate and decode a latin1 string into ucs4
Chris@0 85 */
Chris@0 86 id3_ucs4_t *id3_latin1_ucs4duplicate(id3_latin1_t const *latin1)
Chris@0 87 {
Chris@0 88 id3_ucs4_t *ucs4;
Chris@0 89
Chris@0 90 ucs4 = malloc((id3_latin1_length(latin1) + 1) * sizeof(*ucs4));
Chris@0 91 if (ucs4)
Chris@0 92 id3_latin1_decode(latin1, ucs4);
Chris@0 93
Chris@0 94 return release(ucs4);
Chris@0 95 }
Chris@0 96
Chris@0 97 /*
Chris@0 98 * NAME: latin1->decodechar()
Chris@0 99 * DESCRIPTION: decode a (single) latin1 char into a single ucs4 char
Chris@0 100 */
Chris@0 101 id3_length_t id3_latin1_decodechar(id3_latin1_t const *latin1,
Chris@0 102 id3_ucs4_t *ucs4)
Chris@0 103 {
Chris@0 104 *ucs4 = *latin1;
Chris@0 105
Chris@0 106 return 1;
Chris@0 107 }
Chris@0 108
Chris@0 109 /*
Chris@0 110 * NAME: latin1->encodechar()
Chris@0 111 * DESCRIPTION: encode a single ucs4 char into a (single) latin1 char
Chris@0 112 */
Chris@0 113 id3_length_t id3_latin1_encodechar(id3_latin1_t *latin1, id3_ucs4_t ucs4)
Chris@0 114 {
Chris@0 115 *latin1 = ucs4;
Chris@0 116 if (ucs4 > 0x000000ffL)
Chris@0 117 *latin1 = ID3_UCS4_REPLACEMENTCHAR;
Chris@0 118
Chris@0 119 return 1;
Chris@0 120 }
Chris@0 121
Chris@0 122 /*
Chris@0 123 * NAME: latin1->decode()
Chris@0 124 * DESCRIPTION: decode a complete latin1 string into a ucs4 string
Chris@0 125 */
Chris@0 126 void id3_latin1_decode(id3_latin1_t const *latin1, id3_ucs4_t *ucs4)
Chris@0 127 {
Chris@0 128 do
Chris@0 129 latin1 += id3_latin1_decodechar(latin1, ucs4);
Chris@0 130 while (*ucs4++);
Chris@0 131 }
Chris@0 132
Chris@0 133 /*
Chris@0 134 * NAME: latin1->encode()
Chris@0 135 * DESCRIPTION: encode a complete ucs4 string into a latin1 string
Chris@0 136 */
Chris@0 137 void id3_latin1_encode(id3_latin1_t *latin1, id3_ucs4_t const *ucs4)
Chris@0 138 {
Chris@0 139 do
Chris@0 140 latin1 += id3_latin1_encodechar(latin1, *ucs4);
Chris@0 141 while (*ucs4++);
Chris@0 142 }
Chris@0 143
Chris@0 144 /*
Chris@0 145 * NAME: latin1->put()
Chris@0 146 * DESCRIPTION: serialize a single latin1 character
Chris@0 147 */
Chris@0 148 id3_length_t id3_latin1_put(id3_byte_t **ptr, id3_latin1_t latin1)
Chris@0 149 {
Chris@0 150 if (ptr)
Chris@0 151 *(*ptr)++ = latin1;
Chris@0 152
Chris@0 153 return 1;
Chris@0 154 }
Chris@0 155
Chris@0 156 /*
Chris@0 157 * NAME: latin1->get()
Chris@0 158 * DESCRIPTION: deserialize a single latin1 character
Chris@0 159 */
Chris@0 160 id3_latin1_t id3_latin1_get(id3_byte_t const **ptr)
Chris@0 161 {
Chris@0 162 return *(*ptr)++;
Chris@0 163 }
Chris@0 164
Chris@0 165 /*
Chris@0 166 * NAME: latin1->serialize()
Chris@0 167 * DESCRIPTION: serialize a ucs4 string using latin1 encoding
Chris@0 168 */
Chris@0 169 id3_length_t id3_latin1_serialize(id3_byte_t **ptr, id3_ucs4_t const *ucs4,
Chris@0 170 int terminate)
Chris@0 171 {
Chris@0 172 id3_length_t size = 0;
Chris@0 173 id3_latin1_t latin1[1], *out;
Chris@0 174
Chris@0 175 while (*ucs4) {
Chris@0 176 switch (id3_latin1_encodechar(out = latin1, *ucs4++)) {
Chris@0 177 case 1: size += id3_latin1_put(ptr, *out++);
Chris@0 178 case 0: break;
Chris@0 179 }
Chris@0 180 }
Chris@0 181
Chris@0 182 if (terminate)
Chris@0 183 size += id3_latin1_put(ptr, 0);
Chris@0 184
Chris@0 185 return size;
Chris@0 186 }
Chris@0 187
Chris@0 188 /*
Chris@0 189 * NAME: latin1->deserialize()
Chris@0 190 * DESCRIPTION: deserialize a ucs4 string using latin1 encoding
Chris@0 191 */
Chris@0 192 id3_ucs4_t *id3_latin1_deserialize(id3_byte_t const **ptr, id3_length_t length)
Chris@0 193 {
Chris@0 194 id3_byte_t const *end;
Chris@0 195 id3_latin1_t *latin1ptr, *latin1;
Chris@0 196 id3_ucs4_t *ucs4;
Chris@0 197
Chris@0 198 end = *ptr + length;
Chris@0 199
Chris@0 200 latin1 = malloc((length + 1) * sizeof(*latin1));
Chris@0 201 if (latin1 == 0)
Chris@0 202 return 0;
Chris@0 203
Chris@0 204 latin1ptr = latin1;
Chris@0 205 while (end - *ptr > 0 && (*latin1ptr = id3_latin1_get(ptr)))
Chris@0 206 ++latin1ptr;
Chris@0 207
Chris@0 208 *latin1ptr = 0;
Chris@0 209
Chris@0 210 ucs4 = malloc((id3_latin1_length(latin1) + 1) * sizeof(*ucs4));
Chris@0 211 if (ucs4)
Chris@0 212 id3_latin1_decode(latin1, ucs4);
Chris@0 213
Chris@0 214 free(latin1);
Chris@0 215
Chris@0 216 return ucs4;
Chris@0 217 }