1 /*
2 * Copyright 2008-2013 Various Authors
3 * Copyright 2007 Johannes Weißl
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #ifndef CMUS_APE_H
20 #define CMUS_APE_H
21
22 #include <stdint.h>
23 #include <stdlib.h>
24
25 struct ape_header {
26 /* 1000 or 2000 (1.0, 2.0) */
27 uint32_t version;
28
29 /* tag size (header + tags, excluding footer) */
30 uint32_t size;
31
32 /* number of items */
33 uint32_t count;
34
35 /* global flags for each tag
36 * there are also private flags for every tag
37 * NOTE: 0 for version 1.0 (1000)
38 */
39 uint32_t flags;
40 };
41
42 /* ape flags */
43 #define AF_IS_UTF8(f) (((f) & 6) == 0)
44 #define AF_IS_FOOTER(f) (((f) & (1 << 29)) == 0)
45
46 struct apetag {
47 char *buf;
48 int pos;
49 struct ape_header header;
50 };
51
52 #define APETAG(name) struct apetag name = { .buf = NULL, .pos = 0, }
53
54 int ape_read_tags(struct apetag *ape, int fd, int slow);
55 char *ape_get_comment(struct apetag *ape, char **val);
56
ape_free(struct apetag * ape)57 static inline void ape_free(struct apetag *ape)
58 {
59 free(ape->buf);
60 }
61
62 #endif
63