You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

167 lines
3.2 KiB

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