Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2004, 2005, 2006, 2007, Svend Sorensen |
3 | | * Copyright (c) 2009, 2010 Jochen Keil |
4 | | * For license terms, see the file COPYING in this distribution. |
5 | | */ |
6 | | |
7 | | #include <stdio.h> |
8 | | #include <stdlib.h> |
9 | | #include <string.h> |
10 | | #include "cdtext.h" |
11 | | |
12 | | struct Cdtext { |
13 | | int pti; |
14 | | int format; |
15 | | char *value; |
16 | | }; |
17 | | |
18 | | Cdtext *cdtext_init(void) |
19 | 6.28k | { |
20 | 6.28k | Cdtext *new_cdtext = NULL; |
21 | | |
22 | 6.28k | Cdtext cdtext[] = { |
23 | 6.28k | {PTI_TITLE, FORMAT_CHAR, NULL}, |
24 | 6.28k | {PTI_PERFORMER, FORMAT_CHAR, NULL}, |
25 | 6.28k | {PTI_SONGWRITER, FORMAT_CHAR, NULL}, |
26 | 6.28k | {PTI_COMPOSER, FORMAT_CHAR, NULL}, |
27 | 6.28k | {PTI_ARRANGER, FORMAT_CHAR, NULL}, |
28 | 6.28k | {PTI_MESSAGE, FORMAT_CHAR, NULL}, |
29 | 6.28k | {PTI_DISC_ID, FORMAT_BINARY, NULL}, |
30 | 6.28k | {PTI_GENRE, FORMAT_BINARY, NULL}, |
31 | 6.28k | {PTI_TOC_INFO1, FORMAT_BINARY, NULL}, |
32 | 6.28k | {PTI_TOC_INFO2, FORMAT_BINARY, NULL}, |
33 | 6.28k | {PTI_RESERVED1, FORMAT_CHAR, NULL}, |
34 | 6.28k | {PTI_RESERVED2, FORMAT_CHAR, NULL}, |
35 | 6.28k | {PTI_RESERVED3, FORMAT_CHAR, NULL}, |
36 | 6.28k | {PTI_RESERVED4, FORMAT_CHAR, NULL}, |
37 | 6.28k | {PTI_UPC_ISRC, FORMAT_CHAR, NULL}, |
38 | 6.28k | {PTI_SIZE_INFO, FORMAT_BINARY, NULL}, |
39 | 6.28k | {PTI_END, FORMAT_CHAR, NULL} |
40 | 6.28k | }; |
41 | | |
42 | 6.28k | new_cdtext = (Cdtext *) calloc (sizeof (cdtext) / sizeof (Cdtext), sizeof (Cdtext)); |
43 | 6.28k | if (NULL == new_cdtext) |
44 | 0 | fprintf (stderr, "problem allocating memory\n"); |
45 | 6.28k | else |
46 | 6.28k | memcpy (new_cdtext, cdtext, sizeof(cdtext)); |
47 | | |
48 | 6.28k | return new_cdtext; |
49 | 6.28k | } |
50 | | |
51 | | void cdtext_delete(Cdtext *cdtext) |
52 | 6.28k | { |
53 | 6.28k | int i; |
54 | | |
55 | 6.28k | if (NULL != cdtext) { |
56 | 106k | for (i = 0; PTI_END != cdtext[i].pti; i++) |
57 | 100k | { |
58 | 100k | free (cdtext[i].value); |
59 | 100k | } |
60 | 6.28k | free (cdtext); |
61 | 6.28k | } |
62 | 6.28k | } |
63 | | |
64 | | /* return 0 if there is no cdtext, returns non-zero otherwise */ |
65 | | int cdtext_is_empty(Cdtext *cdtext) |
66 | 0 | { |
67 | 0 | for (; PTI_END != cdtext->pti; cdtext++) |
68 | 0 | if (NULL != cdtext->value) |
69 | 0 | return -1; |
70 | | |
71 | 0 | return 0; |
72 | 0 | } |
73 | | |
74 | | /* sets cdtext's pti entry to field */ |
75 | | void cdtext_set(int pti, char *value, Cdtext *cdtext) |
76 | 6.12k | { |
77 | 6.12k | if (NULL != value) /* don't pass NULL to strdup */ |
78 | 104k | for (; PTI_END != cdtext->pti; cdtext++) |
79 | 97.9k | if (pti == cdtext->pti) { |
80 | 6.12k | free (cdtext->value); |
81 | 6.12k | cdtext->value = strdup (value); |
82 | 6.12k | } |
83 | 6.12k | } |
84 | | |
85 | | /* returns value for pti, NULL if pti is not found */ |
86 | | const char *cdtext_get(enum Pti pti, const Cdtext *cdtext) |
87 | 0 | { |
88 | 0 | for (; PTI_END != cdtext->pti; cdtext++) |
89 | 0 | if (pti == cdtext->pti) |
90 | 0 | return cdtext->value; |
91 | | |
92 | 0 | return NULL; |
93 | 0 | } |
94 | | |
95 | | const char *cdtext_get_key(int pti, int istrack) |
96 | 0 | { |
97 | 0 | const char *key = NULL; |
98 | |
|
99 | 0 | switch (pti) { |
100 | 0 | case PTI_TITLE: |
101 | 0 | key = "TITLE"; |
102 | 0 | break; |
103 | 0 | case PTI_PERFORMER: |
104 | 0 | key = "PERFORMER"; |
105 | 0 | break; |
106 | 0 | case PTI_SONGWRITER: |
107 | 0 | key = "SONGWRITER"; |
108 | 0 | break; |
109 | 0 | case PTI_COMPOSER: |
110 | 0 | key = "COMPOSER"; |
111 | 0 | break; |
112 | 0 | case PTI_ARRANGER: |
113 | 0 | key = "ARRANGER"; |
114 | 0 | break; |
115 | 0 | case PTI_MESSAGE: |
116 | 0 | key = "MESSAGE"; |
117 | 0 | break; |
118 | 0 | case PTI_DISC_ID: |
119 | 0 | key = "DISC_ID"; |
120 | 0 | break; |
121 | 0 | case PTI_GENRE: |
122 | 0 | key = "GENRE"; |
123 | 0 | break; |
124 | 0 | case PTI_TOC_INFO1: |
125 | 0 | key = "TOC_INFO1"; |
126 | 0 | break; |
127 | 0 | case PTI_TOC_INFO2: |
128 | 0 | key = "TOC_INFO1"; |
129 | 0 | break; |
130 | 0 | case PTI_RESERVED1: |
131 | | /* reserved */ |
132 | 0 | break; |
133 | 0 | case PTI_RESERVED2: |
134 | | /* reserved */ |
135 | 0 | break; |
136 | 0 | case PTI_RESERVED3: |
137 | | /* reserved */ |
138 | 0 | break; |
139 | 0 | case PTI_RESERVED4: |
140 | | /* reserved */ |
141 | 0 | break; |
142 | 0 | case PTI_UPC_ISRC: |
143 | 0 | if (0 == istrack) |
144 | 0 | key = "UPC_EAN"; |
145 | 0 | else |
146 | 0 | key = "ISRC"; |
147 | 0 | break; |
148 | 0 | case PTI_SIZE_INFO: |
149 | 0 | key = "SIZE_INFO"; |
150 | 0 | break; |
151 | 0 | } |
152 | | |
153 | 0 | return key; |
154 | 0 | } |
155 | | |
156 | | void cdtext_dump(Cdtext *cdtext, int istrack) |
157 | 0 | { |
158 | 0 | int pti; |
159 | 0 | const char *value = NULL; |
160 | |
|
161 | 0 | for (pti = 0; PTI_END != pti; pti++) { |
162 | 0 | if (NULL != (value = cdtext_get(pti, cdtext))) { |
163 | 0 | printf("%s: ", cdtext_get_key(pti, istrack)); |
164 | 0 | printf("%s\n", value); |
165 | 0 | } |
166 | 0 | } |
167 | 0 | } |