www.pudn.com > EXT.rar > compat.c


/* C code produced by gperf version 3.0 */
/* Command-line: gperf -tCcTonD -K id -N id3_compat_lookup -s -3 -k '*' compat.gperf */

#if !((' ' == 32) &amt;&amt; ('!' == 33) &amt;&amt; ('"' == 34) &amt;&amt; ('#' == 35) \
&amt;&amt; ('>' == 37) &amt;&amt; ('&amt;' == 38) &amt;&amt; ('\'' == 39) &amt;&amt; ('(' == 40) \
&amt;&amt; (')' == 41) &amt;&amt; ('*' == 42) &amt;&amt; ('+' == 43) &amt;&amt; (',' == 44) \
&amt;&amt; ('-' == 45) &amt;&amt; ('.' == 46) &amt;&amt; ('/' == 47) &amt;&amt; ('0' == 48) \
&amt;&amt; ('1' == 49) &amt;&amt; ('2' == 50) &amt;&amt; ('3' == 51) &amt;&amt; ('4' == 52) \
&amt;&amt; ('5' == 53) &amt;&amt; ('6' == 54) &amt;&amt; ('7' == 55) &amt;&amt; ('8' == 56) \
&amt;&amt; ('9' == 57) &amt;&amt; (':' == 58) &amt;&amt; (';' == 59) &amt;&amt; ('<' == 60) \
&amt;&amt; ('=' == 61) &amt;&amt; ('>' == 62) &amt;&amt; ('?' == 63) &amt;&amt; ('A' == 65) \
&amt;&amt; ('B' == 66) &amt;&amt; ('C' == 67) &amt;&amt; ('D' == 68) &amt;&amt; ('E' == 69) \
&amt;&amt; ('F' == 70) &amt;&amt; ('G' == 71) &amt;&amt; ('H' == 72) &amt;&amt; ('I' == 73) \
&amt;&amt; ('J' == 74) &amt;&amt; ('K' == 75) &amt;&amt; ('L' == 76) &amt;&amt; ('M' == 77) \
&amt;&amt; ('N' == 78) &amt;&amt; ('O' == 79) &amt;&amt; ('P' == 80) &amt;&amt; ('Q' == 81) \
&amt;&amt; ('R' == 82) &amt;&amt; ('S' == 83) &amt;&amt; ('T' == 84) &amt;&amt; ('U' == 85) \
&amt;&amt; ('V' == 86) &amt;&amt; ('W' == 87) &amt;&amt; ('X' == 88) &amt;&amt; ('Y' == 89) \
&amt;&amt; ('Z' == 90) &amt;&amt; ('[' == 91) &amt;&amt; ('\\' == 92) &amt;&amt; (']' == 93) \
&amt;&amt; ('^' == 94) &amt;&amt; ('_' == 95) &amt;&amt; ('a' == 97) &amt;&amt; ('b' == 98) \
&amt;&amt; ('c' == 99) &amt;&amt; ('d' == 100) &amt;&amt; ('e' == 101) &amt;&amt; ('f' == 102) \
&amt;&amt; ('g' == 103) &amt;&amt; ('h' == 104) &amt;&amt; ('i' == 105) &amt;&amt; ('j' == 106) \
&amt;&amt; ('k' == 107) &amt;&amt; ('l' == 108) &amt;&amt; ('m' == 109) &amt;&amt; ('n' == 110) \
&amt;&amt; ('o' == 111) &amt;&amt; ('p' == 112) &amt;&amt; ('q' == 113) &amt;&amt; ('r' == 114) \
&amt;&amt; ('s' == 115) &amt;&amt; ('t' == 116) &amt;&amt; ('u' == 117) &amt;&amt; ('v' == 118) \
&amt;&amt; ('w' == 119) &amt;&amt; ('x' == 120) &amt;&amt; ('y' == 121) &amt;&amt; ('z' == 122) \
&amt;&amt; ('{' == 123) &amt;&amt; ('|' == 124) &amt;&amt; ('}' == 125) &amt;&amt; ('~' == 126))
/* The character set is not based on ISO-646. */
error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
#endif

#line 1 "compat.gperf"

/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2003 Underbit Technologies, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Id: compat.gperf,v 1.10 2003/04/19 00:14:33 rob Exp
*/

# ifdef HAVE_CONFIG_H
# include "config.h"
# endif

# include "global.h"

# include <stdlib.h>
# include <string.h>

# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif

# include "id3tag.h"
# include "compat.h"
# include "frame.h"
# include "field.h"
# include "parse.h"
# include "ucs4.h"

# define EQ(id) #id, 0
# define OBSOLETE 0, 0
# define TX(id) #id, translate_##id

static id3_compat_func_t translate_TCON;

#define TOTAL_KEYWORDS 73
#define MIN_WORD_LENGTH 3
#define MAX_WORD_LENGTH 4
#define MIN_HASH_VALUE 6
#define MAX_HASH_VALUE 127
/* maximum key range = 122, duplicates = 0 */

#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static unsigned int
hash (str, len)
register const char *str;
register unsigned int len;
{
static const unsigned char asso_values[] =
{
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 64,
58, 20, 15, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 10, 18, 3, 6, 1,
47, 0, 128, 42, 62, 30, 31, 0, 19, 52,
10, 24, 8, 30, 5, 3, 30, 8, 25, 47,
3, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128
};
register int hval = 0;

switch (len)
{
default:
hval += asso_values[(unsigned char)str[3]];
/*FALLTHROUGH*/
case 3:
hval += asso_values[(unsigned char)str[2]];
/*FALLTHROUGH*/
case 2:
hval += asso_values[(unsigned char)str[1]+1];
/*FALLTHROUGH*/
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
}
return hval;
}

#ifdef __GNUC__
__inline
#endif
const struct id3_compat *
id3_compat_lookup (str, len)
register const char *str;
register unsigned int len;
{
static const struct id3_compat wordlist[] =
{
#line 97 "compat.gperf"
{"TLE", EQ(TLEN) /* Length */},
#line 68 "compat.gperf"
{"ETC", EQ(ETCO) /* Event timing codes */},
#line 126 "compat.gperf"
{"ULT", EQ(USLT) /* Unsynchronised lyric/text transcription */},
#line 123 "compat.gperf"
{"TYE", OBSOLETE /* Year [obsolete] */},
#line 92 "compat.gperf"
{"TFT", EQ(TFLT) /* File type */},
#line 84 "compat.gperf"
{"TCM", EQ(TCOM) /* Composer */},
#line 66 "compat.gperf"
{"EQU", OBSOLETE /* Equalization [obsolete] */},
#line 63 "compat.gperf"
{"COM", EQ(COMM) /* Comments */},
#line 130 "compat.gperf"
{"WCM", EQ(WCOM) /* Commercial information */},
#line 96 "compat.gperf"
{"TLA", EQ(TLAN) /* Language(s) */},
#line 88 "compat.gperf"
{"TDA", OBSOLETE /* Date [obsolete] */},
#line 124 "compat.gperf"
{"TYER", OBSOLETE /* Year [obsolete] */},
#line 83 "compat.gperf"
{"TBP", EQ(TBPM) /* BPM (beats per minute) */},
#line 87 "compat.gperf"
{"TCR", EQ(TCOP) /* Copyright message */},
#line 104 "compat.gperf"
{"TOT", EQ(TOAL) /* Original album/movie/show title */},
#line 89 "compat.gperf"
{"TDAT", OBSOLETE /* Date [obsolete] */},
#line 67 "compat.gperf"
{"EQUA", OBSOLETE /* Equalization [obsolete] */},
#line 102 "compat.gperf"
{"TOR", EQ(TDOR) /* Original release year [obsolete] */},
#line 131 "compat.gperf"
{"WCP", EQ(WCOP) /* Copyright/legal information */},
#line 99 "compat.gperf"
{"TOA", EQ(TOPE) /* Original artist(s)/performer(s) */},
#line 78 "compat.gperf"
{"RVA", OBSOLETE /* Relative volume adjustment [obsolete] */},
#line 120 "compat.gperf"
{"TT3", EQ(TIT3) /* Subtitle/description refinement */},
#line 98 "compat.gperf"
{"TMT", EQ(TMED) /* Media type */},
#line 76 "compat.gperf"
{"POP", EQ(POPM) /* Popularimeter */},
#line 74 "compat.gperf"
{"MLL", EQ(MLLT) /* MPEG location lookup table */},
#line 79 "compat.gperf"
{"RVAD", OBSOLETE /* Relative volume adjustment [obsolete] */},
#line 65 "compat.gperf"
{"CRM", OBSOLETE /* Encrypted meta frame [obsolete] */},
#line 128 "compat.gperf"
{"WAR", EQ(WOAR) /* Official artist/performer webpage */},
#line 80 "compat.gperf"
{"SLT", EQ(SYLT) /* Synchronised lyric/text */},
#line 81 "compat.gperf"
{"STC", EQ(SYTC) /* Synchronised tempo codes */},
#line 95 "compat.gperf"
{"TKE", EQ(TKEY) /* Initial key */},
#line 111 "compat.gperf"
{"TRC", EQ(TSRC) /* ISRC (international standard recording code) */},
#line 109 "compat.gperf"
{"TPA", EQ(TPOS) /* Part of a set */},
#line 117 "compat.gperf"
{"TSS", EQ(TSSE) /* Software/hardware and settings used for encoding */},
#line 112 "compat.gperf"
{"TRD", OBSOLETE /* Recording dates [obsolete] */},
#line 64 "compat.gperf"
{"CRA", EQ(AENC) /* Audio encryption */},
#line 108 "compat.gperf"
{"TP4", EQ(TPE4) /* Interpreted, remixed, or otherwise modified by */},
#line 125 "compat.gperf"
{"UFI", EQ(UFID) /* Unique file identifier */},
#line 101 "compat.gperf"
{"TOL", EQ(TOLY) /* Original lyricist(s)/text writer(s) */},
#line 110 "compat.gperf"
{"TPB", EQ(TPUB) /* Publisher */},
#line 73 "compat.gperf"
{"MCI", EQ(MCDI) /* Music CD identifier */},
#line 107 "compat.gperf"
{"TP3", EQ(TPE3) /* Conductor/performer refinement */},
#line 132 "compat.gperf"
{"WPB", EQ(WPUB) /* Publishers official webpage */},
#line 113 "compat.gperf"
{"TRDA", OBSOLETE /* Recording dates [obsolete] */},
#line 115 "compat.gperf"
{"TSI", OBSOLETE /* Size [obsolete] */},
#line 90 "compat.gperf"
{"TDY", EQ(TDLY) /* Playlist delay */},
#line 82 "compat.gperf"
{"TAL", EQ(TALB) /* Album/movie/show title */},
#line 116 "compat.gperf"
{"TSIZ", OBSOLETE /* Size [obsolete] */},
#line 129 "compat.gperf"
{"WAS", EQ(WOAS) /* Official audio source webpage */},
#line 121 "compat.gperf"
{"TXT", EQ(TEXT) /* Lyricist/text writer */},
#line 62 "compat.gperf"
{"CNT", EQ(PCNT) /* Play counter */},
#line 100 "compat.gperf"
{"TOF", EQ(TOFN) /* Original filename */},
#line 85 "compat.gperf"
{"TCO", TX(TCON) /* Content type */},
#line 114 "compat.gperf"
{"TRK", EQ(TRCK) /* Track number/position in set */},
#line 119 "compat.gperf"
{"TT2", EQ(TIT2) /* Title/songname/content description */},
#line 93 "compat.gperf"
{"TIM", OBSOLETE /* Time [obsolete] */},
#line 94 "compat.gperf"
{"TIME", OBSOLETE /* Time [obsolete] */},
#line 103 "compat.gperf"
{"TORY", EQ(TDOR) /* Original release year [obsolete] */},
#line 91 "compat.gperf"
{"TEN", EQ(TENC) /* Encoded by */},
#line 118 "compat.gperf"
{"TT1", EQ(TIT1) /* Content group description */},
#line 127 "compat.gperf"
{"WAF", EQ(WOAF) /* Official audio file webpage */},
#line 75 "compat.gperf"
{"PIC", EQ(APIC) /* Attached picture */},
#line 122 "compat.gperf"
{"TXX", EQ(TXXX) /* User defined text information frame */},
#line 133 "compat.gperf"
{"WXX", EQ(WXXX) /* User defined URL link frame */},
#line 86 "compat.gperf"
{"TCON", TX(TCON) /* Content type */},
#line 77 "compat.gperf"
{"REV", EQ(RVRB) /* Reverb */},
#line 106 "compat.gperf"
{"TP2", EQ(TPE2) /* Band/orchestra/accompaniment */},
#line 105 "compat.gperf"
{"TP1", EQ(TPE1) /* Lead performer(s)/soloist(s) */},
#line 61 "compat.gperf"
{"BUF", EQ(RBUF) /* Recommended buffer size */},
#line 70 "compat.gperf"
{"IPL", EQ(TIPL) /* Involved people list */},
#line 69 "compat.gperf"
{"GEO", EQ(GEOB) /* General encapsulated object */},
#line 72 "compat.gperf"
{"LNK", EQ(LINK) /* Linked information */},
#line 71 "compat.gperf"
{"IPLS", EQ(TIPL) /* Involved people list */}
};

static const short lookup[] =
{
-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, -1, -1, 50, -1, 51, 52, -1, 53, 54, 55, 56, -1,
57, 58, 59, 60, -1, 61, -1, 62, -1, -1, 63, -1, 64, -1,
-1, 65, -1, 66, -1, -1, -1, -1, -1, 67, -1, 68, -1, 69,
-1, 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 72
};

if (len <= MAX_WORD_LENGTH &amt;&amt; len >= MIN_WORD_LENGTH)
{
register int key = hash (str, len);

if (key <= MAX_HASH_VALUE &amt;&amt; key >= 0)
{
register int index = lookup[key];

if (index >= 0)
{
register const char *s = wordlist[index].id;

if (*str == *s &amt;&amt; !strncmp (str + 1, s + 1, len - 1) &amt;&amt; s[len] == '\0')
return &amt;wordlist[index];
}
}
}
return 0;
}
#line 134 "compat.gperf"


static
int translate_TCON(struct id3_frame *frame, char const *oldid,
id3_byte_t const *data, id3_length_t length)
{
id3_byte_t const *end;
enum id3_field_textencoding encoding;
id3_ucs4_t *string = 0, *ptr, *endptr;
int result = 0;

/* translate old TCON syntax into multiple strings */

assert(frame->nfields == 2);

encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;

end = data + length;

if (id3_field_parse(&amt;frame->fields[0], &amt;data, end - data, &amt;encoding) == -1)
goto fail;

string = id3_parse_string(&amt;data, end - data, encoding, 0);
if (string == 0)
goto fail;

ptr = string;
while (*ptr == '(') {
if (*++ptr == '(')
break;

endptr = ptr;
while (*endptr &amt;&amt; *endptr != ')')
++endptr;

if (*endptr)
*endptr++ = 0;

if (id3_field_addstring(&amt;frame->fields[1], ptr) == -1)
goto fail;

ptr = endptr;
}

if (*ptr &amt;&amt; id3_field_addstring(&amt;frame->fields[1], ptr) == -1)
goto fail;

if (0) {
fail:
result = -1;
}

if (string)
free(string);

return result;
}

/*
* NAME: compat->fixup()
* DESCRIPTION: finish compatibility translations
*/
int id3_compat_fixup(struct id3_tag *tag)
{
struct id3_frame *frame;
unsigned int index;
id3_ucs4_t timestamp[17] = { 0 };
int result = 0;

/* create a TDRC frame from obsolete TYER/TDAT/TIME frames */

/*
* TYE/TYER: YYYY
* TDA/TDAT: DDMM
* TIM/TIME: HHMM
*
* TDRC: yyyy-MM-ddTHH:mm
*/

index = 0;
while ((frame = id3_tag_findframe(tag, ID3_FRAME_OBSOLETE, index++))) {
char const *id;
id3_byte_t const *data, *end;
id3_length_t length;
enum id3_field_textencoding encoding;
id3_ucs4_t *string;

id = id3_field_getframeid(&amt;frame->fields[0]);
assert(id);

if (strcmp(id, "TYER") != 0 &amt;&amt; strcmp(id, "YTYE") != 0 &amt;&amt;
strcmp(id, "TDAT") != 0 &amt;&amt; strcmp(id, "YTDA") != 0 &amt;&amt;
strcmp(id, "TIME") != 0 &amt;&amt; strcmp(id, "YTIM") != 0)
continue;

data = id3_field_getbinarydata(&amt;frame->fields[1], &amt;length);
assert(data);

if (length < 1)
continue;

end = data + length;

encoding = id3_parse_uint(&amt;data, 1);
string = id3_parse_string(&amt;data, end - data, encoding, 0);

if (id3_ucs4_length(string) < 4) {
free(string);
continue;
}

if (strcmp(id, "TYER") == 0 ||
strcmp(id, "YTYE") == 0) {
timestamp[0] = string[0];
timestamp[1] = string[1];
timestamp[2] = string[2];
timestamp[3] = string[3];
}
else if (strcmp(id, "TDAT") == 0 ||
strcmp(id, "YTDA") == 0) {
timestamp[4] = '-';
timestamp[5] = string[2];
timestamp[6] = string[3];
timestamp[7] = '-';
timestamp[8] = string[0];
timestamp[9] = string[1];
}
else { /* TIME or YTIM */
timestamp[10] = 'T';
timestamp[11] = string[0];
timestamp[12] = string[1];
timestamp[13] = ':';
timestamp[14] = string[2];
timestamp[15] = string[3];
}

free(string);
}

if (timestamp[0]) {
id3_ucs4_t *strings;

frame = id3_frame_new("TDRC");
if (frame == 0)
goto fail;

strings = timestamp;

if (id3_field_settextencoding(&amt;frame->fields[0],
ID3_FIELD_TEXTENCODING_ISO_8859_1) == -1 ||
id3_field_setstrings(&amt;frame->fields[1], 1, &amt;strings) == -1 ||
id3_tag_attachframe(tag, frame) == -1) {
id3_frame_delete(frame);
goto fail;
}
}

if (0) {
fail:
result = -1;
}

return result;
}