annotate src/libid3tag-0.15.1b/compat.gperf @ 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 /*
cannam@85 3 * libid3tag - ID3 tag manipulation library
cannam@85 4 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
cannam@85 5 *
cannam@85 6 * This program is free software; you can redistribute it and/or modify
cannam@85 7 * it under the terms of the GNU General Public License as published by
cannam@85 8 * the Free Software Foundation; either version 2 of the License, or
cannam@85 9 * (at your option) any later version.
cannam@85 10 *
cannam@85 11 * This program is distributed in the hope that it will be useful,
cannam@85 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@85 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@85 14 * GNU General Public License for more details.
cannam@85 15 *
cannam@85 16 * You should have received a copy of the GNU General Public License
cannam@85 17 * along with this program; if not, write to the Free Software
cannam@85 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
cannam@85 19 *
cannam@85 20 * $Id: compat.gperf,v 1.11 2004/01/23 09:41:32 rob Exp $
cannam@85 21 */
cannam@85 22
cannam@85 23 # ifdef HAVE_CONFIG_H
cannam@85 24 # include "config.h"
cannam@85 25 # endif
cannam@85 26
cannam@85 27 # include "global.h"
cannam@85 28
cannam@85 29 # include <stdlib.h>
cannam@85 30 # include <string.h>
cannam@85 31
cannam@85 32 # ifdef HAVE_ASSERT_H
cannam@85 33 # include <assert.h>
cannam@85 34 # endif
cannam@85 35
cannam@85 36 # include "id3tag.h"
cannam@85 37 # include "compat.h"
cannam@85 38 # include "frame.h"
cannam@85 39 # include "field.h"
cannam@85 40 # include "parse.h"
cannam@85 41 # include "ucs4.h"
cannam@85 42
cannam@85 43 # define EQ(id) #id, 0
cannam@85 44 # define OBSOLETE 0, 0
cannam@85 45 # define TX(id) #id, translate_##id
cannam@85 46
cannam@85 47 static id3_compat_func_t translate_TCON;
cannam@85 48 %}
cannam@85 49 struct id3_compat;
cannam@85 50 %%
cannam@85 51 #
cannam@85 52 # ID3v2.2 and ID3v2.3 frames
cannam@85 53 #
cannam@85 54 # Only obsolete frames or frames with an equivalent ID3v2.4 frame ID are
cannam@85 55 # listed here. If a frame ID is not listed, it is assumed that the same
cannam@85 56 # frame ID is itself the equivalent ID3v2.4 frame ID.
cannam@85 57 #
cannam@85 58 # This list may also include frames with new content interpretations; the
cannam@85 59 # translation function will rewrite the contents to comply with ID3v2.4.
cannam@85 60 #
cannam@85 61 BUF, EQ(RBUF) /* Recommended buffer size */
cannam@85 62 CNT, EQ(PCNT) /* Play counter */
cannam@85 63 COM, EQ(COMM) /* Comments */
cannam@85 64 CRA, EQ(AENC) /* Audio encryption */
cannam@85 65 CRM, OBSOLETE /* Encrypted meta frame [obsolete] */
cannam@85 66 EQU, OBSOLETE /* Equalization [obsolete] */
cannam@85 67 EQUA, OBSOLETE /* Equalization [obsolete] */
cannam@85 68 ETC, EQ(ETCO) /* Event timing codes */
cannam@85 69 GEO, EQ(GEOB) /* General encapsulated object */
cannam@85 70 IPL, EQ(TIPL) /* Involved people list */
cannam@85 71 IPLS, EQ(TIPL) /* Involved people list */
cannam@85 72 LNK, EQ(LINK) /* Linked information */
cannam@85 73 MCI, EQ(MCDI) /* Music CD identifier */
cannam@85 74 MLL, EQ(MLLT) /* MPEG location lookup table */
cannam@85 75 PIC, EQ(APIC) /* Attached picture */
cannam@85 76 POP, EQ(POPM) /* Popularimeter */
cannam@85 77 REV, EQ(RVRB) /* Reverb */
cannam@85 78 RVA, OBSOLETE /* Relative volume adjustment [obsolete] */
cannam@85 79 RVAD, OBSOLETE /* Relative volume adjustment [obsolete] */
cannam@85 80 SLT, EQ(SYLT) /* Synchronised lyric/text */
cannam@85 81 STC, EQ(SYTC) /* Synchronised tempo codes */
cannam@85 82 TAL, EQ(TALB) /* Album/movie/show title */
cannam@85 83 TBP, EQ(TBPM) /* BPM (beats per minute) */
cannam@85 84 TCM, EQ(TCOM) /* Composer */
cannam@85 85 TCO, TX(TCON) /* Content type */
cannam@85 86 TCON, TX(TCON) /* Content type */
cannam@85 87 TCR, EQ(TCOP) /* Copyright message */
cannam@85 88 TDA, OBSOLETE /* Date [obsolete] */
cannam@85 89 TDAT, OBSOLETE /* Date [obsolete] */
cannam@85 90 TDY, EQ(TDLY) /* Playlist delay */
cannam@85 91 TEN, EQ(TENC) /* Encoded by */
cannam@85 92 TFT, EQ(TFLT) /* File type */
cannam@85 93 TIM, OBSOLETE /* Time [obsolete] */
cannam@85 94 TIME, OBSOLETE /* Time [obsolete] */
cannam@85 95 TKE, EQ(TKEY) /* Initial key */
cannam@85 96 TLA, EQ(TLAN) /* Language(s) */
cannam@85 97 TLE, EQ(TLEN) /* Length */
cannam@85 98 TMT, EQ(TMED) /* Media type */
cannam@85 99 TOA, EQ(TOPE) /* Original artist(s)/performer(s) */
cannam@85 100 TOF, EQ(TOFN) /* Original filename */
cannam@85 101 TOL, EQ(TOLY) /* Original lyricist(s)/text writer(s) */
cannam@85 102 TOR, EQ(TDOR) /* Original release year [obsolete] */
cannam@85 103 TORY, EQ(TDOR) /* Original release year [obsolete] */
cannam@85 104 TOT, EQ(TOAL) /* Original album/movie/show title */
cannam@85 105 TP1, EQ(TPE1) /* Lead performer(s)/soloist(s) */
cannam@85 106 TP2, EQ(TPE2) /* Band/orchestra/accompaniment */
cannam@85 107 TP3, EQ(TPE3) /* Conductor/performer refinement */
cannam@85 108 TP4, EQ(TPE4) /* Interpreted, remixed, or otherwise modified by */
cannam@85 109 TPA, EQ(TPOS) /* Part of a set */
cannam@85 110 TPB, EQ(TPUB) /* Publisher */
cannam@85 111 TRC, EQ(TSRC) /* ISRC (international standard recording code) */
cannam@85 112 TRD, OBSOLETE /* Recording dates [obsolete] */
cannam@85 113 TRDA, OBSOLETE /* Recording dates [obsolete] */
cannam@85 114 TRK, EQ(TRCK) /* Track number/position in set */
cannam@85 115 TSI, OBSOLETE /* Size [obsolete] */
cannam@85 116 TSIZ, OBSOLETE /* Size [obsolete] */
cannam@85 117 TSS, EQ(TSSE) /* Software/hardware and settings used for encoding */
cannam@85 118 TT1, EQ(TIT1) /* Content group description */
cannam@85 119 TT2, EQ(TIT2) /* Title/songname/content description */
cannam@85 120 TT3, EQ(TIT3) /* Subtitle/description refinement */
cannam@85 121 TXT, EQ(TEXT) /* Lyricist/text writer */
cannam@85 122 TXX, EQ(TXXX) /* User defined text information frame */
cannam@85 123 TYE, OBSOLETE /* Year [obsolete] */
cannam@85 124 TYER, OBSOLETE /* Year [obsolete] */
cannam@85 125 UFI, EQ(UFID) /* Unique file identifier */
cannam@85 126 ULT, EQ(USLT) /* Unsynchronised lyric/text transcription */
cannam@85 127 WAF, EQ(WOAF) /* Official audio file webpage */
cannam@85 128 WAR, EQ(WOAR) /* Official artist/performer webpage */
cannam@85 129 WAS, EQ(WOAS) /* Official audio source webpage */
cannam@85 130 WCM, EQ(WCOM) /* Commercial information */
cannam@85 131 WCP, EQ(WCOP) /* Copyright/legal information */
cannam@85 132 WPB, EQ(WPUB) /* Publishers official webpage */
cannam@85 133 WXX, EQ(WXXX) /* User defined URL link frame */
cannam@85 134 %%
cannam@85 135
cannam@85 136 static
cannam@85 137 int translate_TCON(struct id3_frame *frame, char const *oldid,
cannam@85 138 id3_byte_t const *data, id3_length_t length)
cannam@85 139 {
cannam@85 140 id3_byte_t const *end;
cannam@85 141 enum id3_field_textencoding encoding;
cannam@85 142 id3_ucs4_t *string = 0, *ptr, *endptr;
cannam@85 143 int result = 0;
cannam@85 144
cannam@85 145 /* translate old TCON syntax into multiple strings */
cannam@85 146
cannam@85 147 assert(frame->nfields == 2);
cannam@85 148
cannam@85 149 encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;
cannam@85 150
cannam@85 151 end = data + length;
cannam@85 152
cannam@85 153 if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding) == -1)
cannam@85 154 goto fail;
cannam@85 155
cannam@85 156 string = id3_parse_string(&data, end - data, encoding, 0);
cannam@85 157 if (string == 0)
cannam@85 158 goto fail;
cannam@85 159
cannam@85 160 ptr = string;
cannam@85 161 while (*ptr == '(') {
cannam@85 162 if (*++ptr == '(')
cannam@85 163 break;
cannam@85 164
cannam@85 165 endptr = ptr;
cannam@85 166 while (*endptr && *endptr != ')')
cannam@85 167 ++endptr;
cannam@85 168
cannam@85 169 if (*endptr)
cannam@85 170 *endptr++ = 0;
cannam@85 171
cannam@85 172 if (id3_field_addstring(&frame->fields[1], ptr) == -1)
cannam@85 173 goto fail;
cannam@85 174
cannam@85 175 ptr = endptr;
cannam@85 176 }
cannam@85 177
cannam@85 178 if (*ptr && id3_field_addstring(&frame->fields[1], ptr) == -1)
cannam@85 179 goto fail;
cannam@85 180
cannam@85 181 if (0) {
cannam@85 182 fail:
cannam@85 183 result = -1;
cannam@85 184 }
cannam@85 185
cannam@85 186 if (string)
cannam@85 187 free(string);
cannam@85 188
cannam@85 189 return result;
cannam@85 190 }
cannam@85 191
cannam@85 192 /*
cannam@85 193 * NAME: compat->fixup()
cannam@85 194 * DESCRIPTION: finish compatibility translations
cannam@85 195 */
cannam@85 196 int id3_compat_fixup(struct id3_tag *tag)
cannam@85 197 {
cannam@85 198 struct id3_frame *frame;
cannam@85 199 unsigned int index;
cannam@85 200 id3_ucs4_t timestamp[17] = { 0 };
cannam@85 201 int result = 0;
cannam@85 202
cannam@85 203 /* create a TDRC frame from obsolete TYER/TDAT/TIME frames */
cannam@85 204
cannam@85 205 /*
cannam@85 206 * TYE/TYER: YYYY
cannam@85 207 * TDA/TDAT: DDMM
cannam@85 208 * TIM/TIME: HHMM
cannam@85 209 *
cannam@85 210 * TDRC: yyyy-MM-ddTHH:mm
cannam@85 211 */
cannam@85 212
cannam@85 213 index = 0;
cannam@85 214 while ((frame = id3_tag_findframe(tag, ID3_FRAME_OBSOLETE, index++))) {
cannam@85 215 char const *id;
cannam@85 216 id3_byte_t const *data, *end;
cannam@85 217 id3_length_t length;
cannam@85 218 enum id3_field_textencoding encoding;
cannam@85 219 id3_ucs4_t *string;
cannam@85 220
cannam@85 221 id = id3_field_getframeid(&frame->fields[0]);
cannam@85 222 assert(id);
cannam@85 223
cannam@85 224 if (strcmp(id, "TYER") != 0 && strcmp(id, "YTYE") != 0 &&
cannam@85 225 strcmp(id, "TDAT") != 0 && strcmp(id, "YTDA") != 0 &&
cannam@85 226 strcmp(id, "TIME") != 0 && strcmp(id, "YTIM") != 0)
cannam@85 227 continue;
cannam@85 228
cannam@85 229 data = id3_field_getbinarydata(&frame->fields[1], &length);
cannam@85 230 assert(data);
cannam@85 231
cannam@85 232 if (length < 1)
cannam@85 233 continue;
cannam@85 234
cannam@85 235 end = data + length;
cannam@85 236
cannam@85 237 encoding = id3_parse_uint(&data, 1);
cannam@85 238 string = id3_parse_string(&data, end - data, encoding, 0);
cannam@85 239
cannam@85 240 if (id3_ucs4_length(string) < 4) {
cannam@85 241 free(string);
cannam@85 242 continue;
cannam@85 243 }
cannam@85 244
cannam@85 245 if (strcmp(id, "TYER") == 0 ||
cannam@85 246 strcmp(id, "YTYE") == 0) {
cannam@85 247 timestamp[0] = string[0];
cannam@85 248 timestamp[1] = string[1];
cannam@85 249 timestamp[2] = string[2];
cannam@85 250 timestamp[3] = string[3];
cannam@85 251 }
cannam@85 252 else if (strcmp(id, "TDAT") == 0 ||
cannam@85 253 strcmp(id, "YTDA") == 0) {
cannam@85 254 timestamp[4] = '-';
cannam@85 255 timestamp[5] = string[2];
cannam@85 256 timestamp[6] = string[3];
cannam@85 257 timestamp[7] = '-';
cannam@85 258 timestamp[8] = string[0];
cannam@85 259 timestamp[9] = string[1];
cannam@85 260 }
cannam@85 261 else { /* TIME or YTIM */
cannam@85 262 timestamp[10] = 'T';
cannam@85 263 timestamp[11] = string[0];
cannam@85 264 timestamp[12] = string[1];
cannam@85 265 timestamp[13] = ':';
cannam@85 266 timestamp[14] = string[2];
cannam@85 267 timestamp[15] = string[3];
cannam@85 268 }
cannam@85 269
cannam@85 270 free(string);
cannam@85 271 }
cannam@85 272
cannam@85 273 if (timestamp[0]) {
cannam@85 274 id3_ucs4_t *strings;
cannam@85 275
cannam@85 276 frame = id3_frame_new("TDRC");
cannam@85 277 if (frame == 0)
cannam@85 278 goto fail;
cannam@85 279
cannam@85 280 strings = timestamp;
cannam@85 281
cannam@85 282 if (id3_field_settextencoding(&frame->fields[0],
cannam@85 283 ID3_FIELD_TEXTENCODING_ISO_8859_1) == -1 ||
cannam@85 284 id3_field_setstrings(&frame->fields[1], 1, &strings) == -1 ||
cannam@85 285 id3_tag_attachframe(tag, frame) == -1) {
cannam@85 286 id3_frame_delete(frame);
cannam@85 287 goto fail;
cannam@85 288 }
cannam@85 289 }
cannam@85 290
cannam@85 291 if (0) {
cannam@85 292 fail:
cannam@85 293 result = -1;
cannam@85 294 }
cannam@85 295
cannam@85 296 return result;
cannam@85 297 }