Coverage Report

Created: 2025-07-18 07:05

/src/libcue/cdtext.c
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
}