Blame example/cdtext-raw.c

Packit dd8086
/* -*- C -*-
Packit dd8086
  Copyright (C) 2004, 2006, 2008, 2010, 2011, 2012, 2017
Packit dd8086
  Rocky Bernstein <rocky@gnu.org>
Packit dd8086
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/*
Packit dd8086
   Example demonstrating the parsing of raw CD-Text files
Packit dd8086
   Output adapted from cd-info.
Packit dd8086
*/
Packit dd8086
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
#include "config.h"
Packit dd8086
#define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDIO_H
Packit dd8086
#include <stdio.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STDLIB_H
Packit dd8086
#include <stdlib.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
Packit dd8086
#define CDTEXT_LEN_BINARY_MAX 9216
Packit dd8086
Packit dd8086
static void
Packit dd8086
print_cdtext_track_info(cdtext_t *p_cdtext, track_t i_track, const char *psz_msg) {
Packit dd8086
Packit dd8086
  if (NULL != p_cdtext) {
Packit dd8086
    cdtext_field_t i;
Packit dd8086
Packit dd8086
    printf("%s\n", psz_msg);
Packit dd8086
Packit dd8086
    for (i=0; i < MAX_CDTEXT_FIELDS; i++) {
Packit dd8086
      if (cdtext_get_const(p_cdtext, i, i_track)) {
Packit dd8086
        printf("\t%s: %s\n", cdtext_field2str(i), cdtext_get_const(p_cdtext, i, i_track));
Packit dd8086
      }
Packit dd8086
    }
Packit dd8086
  }
Packit dd8086
}
Packit dd8086
Packit dd8086
static void
Packit dd8086
print_cdtext_info(cdtext_t *p_cdtext) {
Packit dd8086
  track_t i_first_track = 0;
Packit dd8086
  track_t i_last_track = 0;
Packit dd8086
  cdtext_lang_t *languages;
Packit dd8086
  cdtext_genre_t genre;
Packit dd8086
Packit dd8086
  int i, j;
Packit dd8086
Packit dd8086
  languages = cdtext_list_languages(p_cdtext);
Packit dd8086
  for(i=0; i<8; i++)
Packit dd8086
    if ( CDTEXT_LANGUAGE_UNKNOWN != languages[i]
Packit dd8086
         && cdtext_select_language(p_cdtext, languages[i]))
Packit dd8086
    {
Packit dd8086
      printf("\nLanguage %d '%s':\n", i, cdtext_lang2str(languages[i]));
Packit dd8086
Packit dd8086
      print_cdtext_track_info(p_cdtext, 0, "CD-TEXT for Disc:");
Packit dd8086
      genre = cdtext_get_genre(p_cdtext);
Packit dd8086
      if ( CDTEXT_GENRE_UNUSED != genre)
Packit dd8086
        printf("\tGENRE_CODE: %d (%s)\n", genre, cdtext_genre2str(genre));
Packit dd8086
Packit dd8086
      i_first_track = cdtext_get_first_track(p_cdtext);
Packit dd8086
      i_last_track = cdtext_get_last_track(p_cdtext);
Packit dd8086
Packit dd8086
      for ( j = i_first_track ; j <= i_last_track; j++ ) {
Packit dd8086
        char msg[50];
Packit dd8086
        sprintf(msg, "CD-TEXT for Track %2d:", j);
Packit dd8086
        print_cdtext_track_info(p_cdtext, j, msg);
Packit dd8086
      }
Packit dd8086
    }
Packit dd8086
}
Packit dd8086
Packit dd8086
static cdtext_t *
Packit dd8086
read_cdtext(const char *path) {
Packit dd8086
  FILE *fp;
Packit dd8086
  size_t size;
Packit dd8086
  uint8_t cdt_data[CDTEXT_LEN_BINARY_MAX+4];
Packit dd8086
  cdtext_t *cdt;
Packit dd8086
Packit dd8086
  fp = fopen(path, "rb");
Packit dd8086
  if (NULL == fp) {
Packit dd8086
    fprintf(stderr, "could not open file `%s'\n", path);
Packit dd8086
    exit(3);
Packit dd8086
  }
Packit dd8086
Packit dd8086
  size = fread(cdt_data, sizeof(uint8_t), sizeof(cdt_data), fp);
Packit dd8086
  fclose(fp);
Packit dd8086
Packit dd8086
  if (size < 5) {
Packit dd8086
    fprintf(stderr, "file `%s' is too small to contain CD-TEXT\n", path);
Packit dd8086
    exit(1);
Packit dd8086
  }
Packit dd8086
Packit dd8086
  /* Truncate header when it is too large. The standard is ambiguous here*/
Packit dd8086
  if (cdt_data[0] > 0x80) {
Packit dd8086
    size -= 4;
Packit dd8086
  }
Packit dd8086
Packit dd8086
  /* ignore trailing 0 */
Packit dd8086
  if (1 == size % 18)
Packit dd8086
    size -= 1;
Packit dd8086
Packit dd8086
  /* init cdtext */
Packit dd8086
  cdt = cdtext_init ();
Packit dd8086
  if(0 != cdtext_data_init(cdt, cdt_data, size)) {
Packit dd8086
    fprintf(stderr, "failed to parse CD-Text file `%s'\n", path);
Packit dd8086
    free(cdt);
Packit dd8086
    exit(2);
Packit dd8086
  }
Packit dd8086
Packit dd8086
  return cdt;
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
main(int argc, const char *argv[]) {
Packit dd8086
  cdtext_t *cdt;
Packit dd8086
Packit dd8086
  char *cdt_path = NULL;
Packit dd8086
Packit dd8086
  if (argc > 1) {
Packit dd8086
    cdt_path = (char *) argv[1];
Packit dd8086
  }else{
Packit dd8086
    fprintf(stderr, "no CD-Text file given\n");
Packit dd8086
    exit(77);
Packit dd8086
  }
Packit dd8086
Packit dd8086
  cdt = read_cdtext(cdt_path);
Packit dd8086
  print_cdtext_info(cdt);
Packit dd8086
  free(cdt);
Packit dd8086
Packit dd8086
  return 0;
Packit dd8086
}