annotate src/libid3tag-0.15.1b/util.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 545efbb81310
children
rev   line source
cannam@85 1 /*
cannam@85 2 * libid3tag - ID3 tag manipulation library
cannam@85 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
cannam@85 4 *
cannam@85 5 * This program is free software; you can redistribute it and/or modify
cannam@85 6 * it under the terms of the GNU General Public License as published by
cannam@85 7 * the Free Software Foundation; either version 2 of the License, or
cannam@85 8 * (at your option) any later version.
cannam@85 9 *
cannam@85 10 * This program is distributed in the hope that it will be useful,
cannam@85 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@85 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@85 13 * GNU General Public License for more details.
cannam@85 14 *
cannam@85 15 * You should have received a copy of the GNU General Public License
cannam@85 16 * along with this program; if not, write to the Free Software
cannam@85 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
cannam@85 18 *
cannam@85 19 * $Id: util.c,v 1.9 2004/01/23 09:41:32 rob Exp $
cannam@85 20 */
cannam@85 21
cannam@85 22 # ifdef HAVE_CONFIG_H
cannam@85 23 # include "config.h"
cannam@85 24 # endif
cannam@85 25
cannam@85 26 # include "global.h"
cannam@85 27
cannam@85 28 # include <stdlib.h>
cannam@85 29 # include <zlib.h>
cannam@85 30
cannam@85 31 # include "id3tag.h"
cannam@85 32 # include "util.h"
cannam@85 33
cannam@85 34 /*
cannam@85 35 * NAME: util->unsynchronise()
cannam@85 36 * DESCRIPTION: perform (in-place) unsynchronisation
cannam@85 37 */
cannam@85 38 id3_length_t id3_util_unsynchronise(id3_byte_t *data, id3_length_t length)
cannam@85 39 {
cannam@85 40 id3_length_t bytes = 0, count;
cannam@85 41 id3_byte_t *end = data + length;
cannam@85 42 id3_byte_t const *ptr;
cannam@85 43
cannam@85 44 if (length == 0)
cannam@85 45 return 0;
cannam@85 46
cannam@85 47 for (ptr = data; ptr < end - 1; ++ptr) {
cannam@85 48 if (ptr[0] == 0xff && (ptr[1] == 0x00 || (ptr[1] & 0xe0) == 0xe0))
cannam@85 49 ++bytes;
cannam@85 50 }
cannam@85 51
cannam@85 52 if (bytes) {
cannam@85 53 ptr = end;
cannam@85 54 end += bytes;
cannam@85 55
cannam@85 56 *--end = *--ptr;
cannam@85 57
cannam@85 58 for (count = bytes; count; *--end = *--ptr) {
cannam@85 59 if (ptr[-1] == 0xff && (ptr[0] == 0x00 || (ptr[0] & 0xe0) == 0xe0)) {
cannam@85 60 *--end = 0x00;
cannam@85 61 --count;
cannam@85 62 }
cannam@85 63 }
cannam@85 64 }
cannam@85 65
cannam@85 66 return length + bytes;
cannam@85 67 }
cannam@85 68
cannam@85 69 /*
cannam@85 70 * NAME: util->deunsynchronise()
cannam@85 71 * DESCRIPTION: undo unsynchronisation (in-place)
cannam@85 72 */
cannam@85 73 id3_length_t id3_util_deunsynchronise(id3_byte_t *data, id3_length_t length)
cannam@85 74 {
cannam@85 75 id3_byte_t const *old, *end = data + length;
cannam@85 76 id3_byte_t *new;
cannam@85 77
cannam@85 78 if (length == 0)
cannam@85 79 return 0;
cannam@85 80
cannam@85 81 for (old = new = data; old < end - 1; ++old) {
cannam@85 82 *new++ = *old;
cannam@85 83 if (old[0] == 0xff && old[1] == 0x00)
cannam@85 84 ++old;
cannam@85 85 }
cannam@85 86
cannam@85 87 *new++ = *old;
cannam@85 88
cannam@85 89 return new - data;
cannam@85 90 }
cannam@85 91
cannam@85 92 /*
cannam@85 93 * NAME: util->compress()
cannam@85 94 * DESCRIPTION: perform zlib deflate method compression
cannam@85 95 */
cannam@85 96 id3_byte_t *id3_util_compress(id3_byte_t const *data, id3_length_t length,
cannam@85 97 id3_length_t *newlength)
cannam@85 98 {
cannam@85 99 id3_byte_t *compressed;
cannam@85 100
cannam@85 101 *newlength = length + 12;
cannam@85 102 *newlength += *newlength / 1000;
cannam@85 103
cannam@85 104 compressed = malloc(*newlength);
cannam@85 105 if (compressed) {
cannam@85 106 if (compress2(compressed, newlength, data, length,
cannam@85 107 Z_BEST_COMPRESSION) != Z_OK ||
cannam@85 108 *newlength >= length) {
cannam@85 109 free(compressed);
cannam@85 110 compressed = 0;
cannam@85 111 }
cannam@85 112 else {
cannam@85 113 id3_byte_t *resized;
cannam@85 114
cannam@85 115 resized = realloc(compressed, *newlength ? *newlength : 1);
cannam@85 116 if (resized)
cannam@85 117 compressed = resized;
cannam@85 118 }
cannam@85 119 }
cannam@85 120
cannam@85 121 return compressed;
cannam@85 122 }
cannam@85 123
cannam@85 124 /*
cannam@85 125 * NAME: util->decompress()
cannam@85 126 * DESCRIPTION: undo zlib deflate method compression
cannam@85 127 */
cannam@85 128 id3_byte_t *id3_util_decompress(id3_byte_t const *data, id3_length_t length,
cannam@85 129 id3_length_t newlength)
cannam@85 130 {
cannam@85 131 id3_byte_t *decompressed;
cannam@85 132
cannam@85 133 decompressed = malloc(newlength ? newlength : 1);
cannam@85 134 if (decompressed) {
cannam@85 135 id3_length_t size;
cannam@85 136
cannam@85 137 size = newlength;
cannam@85 138
cannam@85 139 if (uncompress(decompressed, &size, data, length) != Z_OK ||
cannam@85 140 size != newlength) {
cannam@85 141 free(decompressed);
cannam@85 142 decompressed = 0;
cannam@85 143 }
cannam@85 144 }
cannam@85 145
cannam@85 146 return decompressed;
cannam@85 147 }