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.19k  | { | 
20  | 6.19k  |   Cdtext *new_cdtext = NULL;  | 
21  |  |  | 
22  | 6.19k  |   Cdtext cdtext[] = { | 
23  | 6.19k  |     {PTI_TITLE,   FORMAT_CHAR,  NULL}, | 
24  | 6.19k  |     {PTI_PERFORMER,   FORMAT_CHAR,  NULL}, | 
25  | 6.19k  |     {PTI_SONGWRITER,  FORMAT_CHAR,  NULL}, | 
26  | 6.19k  |     {PTI_COMPOSER,    FORMAT_CHAR,  NULL}, | 
27  | 6.19k  |     {PTI_ARRANGER,    FORMAT_CHAR,  NULL}, | 
28  | 6.19k  |     {PTI_MESSAGE,   FORMAT_CHAR,  NULL}, | 
29  | 6.19k  |     {PTI_DISC_ID,   FORMAT_BINARY,  NULL}, | 
30  | 6.19k  |     {PTI_GENRE,   FORMAT_BINARY,  NULL}, | 
31  | 6.19k  |     {PTI_TOC_INFO1,   FORMAT_BINARY,  NULL}, | 
32  | 6.19k  |     {PTI_TOC_INFO2,   FORMAT_BINARY,  NULL}, | 
33  | 6.19k  |     {PTI_RESERVED1,   FORMAT_CHAR,  NULL}, | 
34  | 6.19k  |     {PTI_RESERVED2,   FORMAT_CHAR,  NULL}, | 
35  | 6.19k  |     {PTI_RESERVED3,   FORMAT_CHAR,  NULL}, | 
36  | 6.19k  |     {PTI_RESERVED4,   FORMAT_CHAR,  NULL}, | 
37  | 6.19k  |     {PTI_UPC_ISRC,    FORMAT_CHAR,  NULL}, | 
38  | 6.19k  |     {PTI_SIZE_INFO,   FORMAT_BINARY,  NULL}, | 
39  | 6.19k  |     {PTI_END,   FORMAT_CHAR,  NULL} | 
40  | 6.19k  |   };  | 
41  |  |  | 
42  | 6.19k  |   new_cdtext = (Cdtext *) calloc (sizeof (cdtext) / sizeof (Cdtext), sizeof (Cdtext));  | 
43  | 6.19k  |   if (NULL == new_cdtext)  | 
44  | 0  |     fprintf (stderr, "problem allocating memory\n");  | 
45  | 6.19k  |   else  | 
46  | 6.19k  |     memcpy (new_cdtext, cdtext, sizeof(cdtext));  | 
47  |  |  | 
48  | 6.19k  |   return new_cdtext;  | 
49  | 6.19k  | }  | 
50  |  |  | 
51  |  | void cdtext_delete(Cdtext *cdtext)  | 
52  | 6.19k  | { | 
53  | 6.19k  |   int i;  | 
54  |  |  | 
55  | 6.19k  |   if (NULL != cdtext) { | 
56  | 105k  |     for (i = 0; PTI_END != cdtext[i].pti; i++)  | 
57  | 99.1k  |     { | 
58  | 99.1k  |       free (cdtext[i].value);  | 
59  | 99.1k  |     }  | 
60  | 6.19k  |     free (cdtext);  | 
61  | 6.19k  |   }  | 
62  | 6.19k  | }  | 
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  | 9.42k  | { | 
77  | 9.42k  |   if (NULL != value) /* don't pass NULL to strdup */  | 
78  | 160k  |     for (; PTI_END != cdtext->pti; cdtext++)  | 
79  | 150k  |       if (pti == cdtext->pti) { | 
80  | 9.42k  |         free (cdtext->value);  | 
81  | 9.42k  |         cdtext->value = strdup (value);  | 
82  | 9.42k  |       }  | 
83  | 9.42k  | }  | 
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  | }  |