mcn -> psz_mcn and other psz variables.

bincue.c: a little closer to getting cuetools parse_cuefile useable.
This commit is contained in:
rocky
2004-07-09 02:46:42 +00:00
parent 0a905205c7
commit 56e40df160
6 changed files with 178 additions and 105 deletions

View File

@@ -1,9 +1,9 @@
/*
$Id: bincue.c,v 1.25 2004/07/09 01:23:46 rocky Exp $
$Id: bincue.c,v 1.26 2004/07/09 02:46:42 rocky Exp $
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
toc parsing routine adapted from cuetools
cue parsing routine adapted from cuetools
Copyright (C) 2003 Svend Sanjay Sorensen <ssorensen@fastmail.fm>
This program is free software; you can redistribute it and/or modify
@@ -26,7 +26,7 @@
(*.cue).
*/
static const char _rcsid[] = "$Id: bincue.c,v 1.25 2004/07/09 01:23:46 rocky Exp $";
static const char _rcsid[] = "$Id: bincue.c,v 1.26 2004/07/09 02:46:42 rocky Exp $";
#include "cdio_assert.h"
#include "cdio_private.h"
@@ -133,13 +133,13 @@ typedef struct {
bool sector_2336; /* Playstation (PSX) uses 2336-byte sectors */
char *cue_name;
char *mcn; /* Media Catalog Number. */
char *psz_cue_name;
char *psz_mcn; /* Media Catalog Number. */
track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track
add 1 for leadout. */
track_t i_tracks; /* number of tracks in image */
track_t i_first_track; /* track number of first track */
char *catalog;
char *psz_catalog;
cdtext_t *cdtext; /* CD-TEXT */
bool have_cue;
} _img_private_t;
@@ -176,7 +176,7 @@ _bincue_init (_img_private_t *env)
return false;
/* Read in CUE sheet. */
if ((env->cue_name != NULL)) {
if ((env->psz_cue_name != NULL)) {
env->have_cue = _bincue_image_read_cue(env);
}
@@ -423,12 +423,14 @@ mmssff_to_lba (char *s)
#define MAXLINE 4096 /* maximum line length + 1 */
static void
parse_cue (_img_private_t *cd, char *line, int line_num)
parse_cuefile (_img_private_t *cd, char *psz_line,
int i_line, cdio_log_level_t log_level)
{
char *keyword, *field;
int i = cd->i_tracks - 1;
bool seen_first_index_for_track=false;
if (NULL != (keyword = strtok (line, " \t\n\r"))) {
if (NULL != (keyword = strtok (psz_line, " \t\n\r"))) {
/* REM remarks ... */
if (0 == strcmp ("REM", keyword)) {
;
@@ -438,12 +440,12 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
} else if (0 == strcmp ("CATALOG", keyword)) {
if (-1 == i) {
if (NULL != (field = strtok (NULL, " \t\n\r")))
cd->catalog = strdup (field);
cd->psz_catalog = strdup (field);
if (NULL != (field = strtok (NULL, " \t\n\r")))
fprintf (stderr, "%s: format error\n", keyword);
cdio_log (log_level, "%s: format error\n", keyword);
} else {
fprintf (stderr, "%d: only allowed in global section: %s\n",
line_num, keyword);
cdio_log (log_level, "%d: only allowed in global section: %s\n",
i_line, keyword);
}
/* FILE "<filename>" <BINARY|WAVE|other?> */
@@ -451,7 +453,7 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
if (NULL != (field = strtok (NULL, "\"\t\n\r")))
cd->tocent[i + 1].filename = strdup (field);
else
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
cdio_log (log_level, "%d: format error: %s\n", i_line, keyword);
/* TRACK N <mode> */
} else if (0 == strcmp ("TRACK", keyword)) {
@@ -460,26 +462,78 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
if (NULL != (field = strtok (NULL, " \t\n\r")))
; /* skip index number */
if (NULL != (field = strtok (NULL, " \t\n\r"))) {
if (0 == strcmp ("AUDIO", field))
cd->tocent[i].mode = AUDIO;
else if (0 == strcmp ("MODE1/2048", field))
cd->tocent[i].mode = MODE1;
else if (0 == strcmp ("MODE1/2352", field))
cd->tocent[i].mode = MODE1_RAW;
else if (0 == strcmp ("MODE2/2336", field))
cd->tocent[i].mode = MODE2;
else if (0 == strcmp ("MODE2/2048", field))
cd->tocent[i].mode = MODE2_FORM1;
else if (0 == strcmp ("MODE2/2324", field))
cd->tocent[i].mode = MODE2_FORM2;
else if (0 == strcmp ("MODE2/2336", field))
cd->tocent[i].mode = MODE2_FORM_MIX;
else if (0 == strcmp ("MODE2/2352", field))
cd->tocent[i].mode = MODE2_RAW;
else
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
track_info_t *this_track=&(cd->tocent[cd->i_tracks]);
this_track->track_num = cd->i_tracks;
this_track->num_indices = 0;
if (0 == strcmp ("AUDIO", field)) {
this_track->mode = AUDIO;
this_track->blocksize = CDIO_CD_FRAMESIZE_RAW;
this_track->datasize = CDIO_CD_FRAMESIZE_RAW;
this_track->datastart = 0;
this_track->endsize = 0;
this_track->track_format = TRACK_FORMAT_AUDIO;
this_track->track_green = false;
cd->i_tracks++;
seen_first_index_for_track=false;
} else if (0 == strcmp ("MODE1/2048", field)) {
this_track->mode = MODE1;
this_track->blocksize = 2048;
/* Is the below correct? */
this_track->datastart = 0;
this_track->datasize = CDIO_CD_FRAMESIZE;
this_track->endsize = 0;
} else if (0 == strcmp ("MODE1/2352", field)) {
this_track->blocksize = 2352;
this_track->datastart = CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE;
this_track->datasize = CDIO_CD_FRAMESIZE;
this_track->endsize = CDIO_CD_EDC_SIZE + CDIO_CD_M1F1_ZERO_SIZE
+ CDIO_CD_ECC_SIZE;
this_track->mode = MODE1_RAW;
} else if (0 == strcmp ("MODE2/2336", field)) {
this_track->blocksize = 2336;
this_track->track_format= TRACK_FORMAT_XA;
this_track->track_green = true;
this_track->mode = MODE2;
this_track->datastart = CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE;
this_track->datasize = M2RAW_SECTOR_SIZE;
this_track->endsize = 0;
cd->i_tracks++;
} else if (0 == strcmp ("MODE2/2048", field)) {
this_track->blocksize = 2048;
this_track->track_format= TRACK_FORMAT_XA;
this_track->track_green = true;
this_track->mode = MODE2_FORM1;
cd->i_tracks++;
} else if (0 == strcmp ("MODE2/2324", field)) {
this_track->blocksize = 2324;
this_track->track_format= TRACK_FORMAT_XA;
this_track->track_green = true;
this_track->mode = MODE2_FORM2;
cd->i_tracks++;
} else if (0 == strcmp ("MODE2/2336", field)) {
this_track->blocksize = 2336;
this_track->track_format= TRACK_FORMAT_XA;
this_track->track_green = true;
this_track->mode = MODE2_FORM_MIX;
this_track->datastart = CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE;
this_track->datasize = M2RAW_SECTOR_SIZE;
this_track->endsize = 0;
cd->i_tracks++;
} else if (0 == strcmp ("MODE2/2352", field)) {
this_track->blocksize = 2352;
this_track->track_format= TRACK_FORMAT_XA;
this_track->track_green = true;
this_track->mode = MODE2_RAW;
this_track->datastart = CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE +
CDIO_CD_SUBHEADER_SIZE;
this_track->datasize = CDIO_CD_FRAMESIZE;
this_track->endsize = CDIO_CD_SYNC_SIZE + CDIO_CD_ECC_SIZE;
cd->i_tracks++;
} else {
cdio_log (log_level, "%d: format error: %s\n", i_line, keyword);
}
} else {
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
cdio_log (log_level, "%d: format error: %s\n", i_line, keyword);
}
/* FLAGS flag1 flag2 ... */
@@ -495,12 +549,12 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
} else if (0 == strcmp ("SCMS", field)) {
cd->tocent[i].flags |= SCMS;
} else {
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
cdio_warn ("%d: format error: %s\n", i_line, keyword);
}
}
} else {
fprintf (stderr, "%d: not allowed in global section: %s\n", line_num,
keyword);
cdio_log (log_level, "%d: not allowed in global section: %s\n",
i_line, keyword);
}
/* ISRC CCOOOYYSSSSS */
@@ -509,10 +563,10 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
if (NULL != (field = strtok (NULL, " \t\n\r")))
cd->tocent[i].isrc = strdup (field);
else
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
cdio_log (log_level, "%d: format error: %s\n", i_line, keyword);
} else {
fprintf (stderr, "%d: not allowed in global section: %s\n",
line_num, keyword);
cdio_log (log_level, "%d: not allowed in global section: %s\n",
i_line, keyword);
}
/* PREGAP MM:SS:FF */
@@ -521,12 +575,12 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
if (NULL != (field = strtok (NULL, " \t\n\r")))
cd->tocent[i].pregap = mmssff_to_lba (field);
else
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
cdio_log (log_level, "%d: format error: %s\n", i_line, keyword);
if (NULL != (field = strtok (NULL, " \t\n\r")))
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
cdio_log (log_level, "%d: format error: %s\n", i_line, keyword);
} else {
fprintf (stderr, "%d: not allowed in global section: %s\n",
line_num, keyword);
cdio_log (log_level, "%d: not allowed in global section: %s\n",
i_line, keyword);
}
/* INDEX [##] MM:SS:FF */
@@ -541,10 +595,10 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
;
#endif
else
fprintf (stderr, "%d: format error: %s\n", line_num, keyword);
cdio_log (log_level, "%d: format error: %s\n", i_line, keyword);
} else {
fprintf (stderr, "%d: not allowed in global section: %s\n",
line_num, keyword);
cdio_log (log_level, "%d: not allowed in global section: %s\n",
i_line, keyword);
}
/* CD-TEXT */
@@ -561,12 +615,10 @@ parse_cue (_img_private_t *cd, char *line, int line_num)
/* unrecognized line */
} else {
fprintf(stderr, "%d: warning: unrecognized keyword: %s\n",
line_num, keyword);
cdio_log(log_level, "%d: warning: unrecognized keyword: %s\n",
i_line, keyword);
}
}
cd->i_tracks = i + 1;
}
static bool
@@ -581,14 +633,14 @@ _bincue_image_read_cue (_img_private_t *env)
int start_index;
bool seen_first_index_for_track=false;
if ( env == NULL || env->cue_name == NULL ) return false;
if ( env == NULL || env->psz_cue_name == NULL ) return false;
fp = fopen (env->cue_name, "r");
fp = fopen (env->psz_cue_name, "r");
if (fp == NULL) return false;
env->i_tracks=0;
env->i_first_track=1;
env->mcn=NULL;
env->psz_mcn=NULL;
while ((fgets(line, MAXLINE, fp)) != NULL) {
char s[80];
@@ -603,7 +655,7 @@ _bincue_image_read_cue (_img_private_t *env)
*/
/* printf("Found file name %s\n", s); */
} else if (1==sscanf(p, "CATALOG %80s", s)) {
env->mcn = strdup(s);
env->psz_mcn = strdup(s);
} else if (2==sscanf(p, "TRACK %d MODE2/%d", &i_track, &blocksize)) {
track_info_t *this_track=&(env->tocent[env->i_tracks]);
this_track->track_num = i_track;
@@ -896,10 +948,20 @@ static void
_free_bincue (void *user_data)
{
_img_private_t *env = user_data;
track_t i_track;
if (NULL == env) return;
free_if_notnull(env->mcn);
free_if_notnull(env->cue_name);
for (i_track=0; i_track < env->i_tracks; i_track++) {
free_if_notnull(env->tocent[i_track].filename);
free_if_notnull(env->tocent[i_track].isrc);
cdtext_delete(env->tocent[i_track].cdtext);
}
free_if_notnull(env->psz_mcn);
free_if_notnull(env->psz_catalog);
free_if_notnull(env->psz_cue_name);
cdtext_delete(env->cdtext);
cdio_generic_stdio_free(env);
free(env);
}
@@ -947,12 +1009,12 @@ _set_arg_bincue (void *user_data, const char key[], const char value[])
}
else if (!strcmp (key, "cue"))
{
free_if_notnull (env->cue_name);
free_if_notnull (env->psz_cue_name);
if (!value)
return -2;
env->cue_name = strdup (value);
env->psz_cue_name = strdup (value);
}
else
return -1;
@@ -971,7 +1033,7 @@ _get_arg_bincue (void *user_data, const char key[])
if (!strcmp (key, "source")) {
return env->gen.source_name;
} else if (!strcmp (key, "cue")) {
return env->cue_name;
return env->psz_cue_name;
} else if (!strcmp(key, "access-mode")) {
return "image";
}
@@ -1086,7 +1148,7 @@ _get_lba_track_bincue(void *user_data, track_t i_track)
}
/*!
Return corresponding BIN file if cue_name is a cue file or NULL
Return corresponding BIN file if psz_cue_name is a cue file or NULL
if not a CUE file.
*/
@@ -1094,22 +1156,22 @@ _get_lba_track_bincue(void *user_data, track_t i_track)
started for now.
*/
char *
cdio_is_cuefile(const char *cue_name)
cdio_is_cuefile(const char *psz_cue_name)
{
int i;
char *bin_name;
if (cue_name == NULL) return NULL;
if (psz_cue_name == NULL) return NULL;
bin_name=strdup(cue_name);
bin_name=strdup(psz_cue_name);
i=strlen(bin_name)-strlen("cue");
if (i>0) {
if (cue_name[i]=='c' && cue_name[i+1]=='u' && cue_name[i+2]=='e') {
if (psz_cue_name[i]=='c' && psz_cue_name[i+1]=='u' && psz_cue_name[i+2]=='e') {
bin_name[i++]='b'; bin_name[i++]='i'; bin_name[i++]='n';
return bin_name;
}
else if (cue_name[i]=='C' && cue_name[i+1]=='U' && cue_name[i+2]=='E') {
else if (psz_cue_name[i]=='C' && psz_cue_name[i+1]=='U' && psz_cue_name[i+2]=='E') {
bin_name[i++]='B'; bin_name[i++]='I'; bin_name[i++]='N';
return bin_name;
}
@@ -1130,24 +1192,24 @@ char *
cdio_is_binfile(const char *bin_name)
{
int i;
char *cue_name;
char *psz_cue_name;
if (bin_name == NULL) return NULL;
cue_name=strdup(bin_name);
psz_cue_name=strdup(bin_name);
i=strlen(bin_name)-strlen("bin");
if (i>0) {
if (bin_name[i]=='b' && bin_name[i+1]=='i' && bin_name[i+2]=='n') {
cue_name[i++]='c'; cue_name[i++]='u'; cue_name[i++]='e';
return cue_name;
psz_cue_name[i++]='c'; psz_cue_name[i++]='u'; psz_cue_name[i++]='e';
return psz_cue_name;
}
else if (bin_name[i]=='B' && bin_name[i+1]=='I' && bin_name[i+2]=='N') {
cue_name[i++]='C'; cue_name[i++]='U'; cue_name[i++]='E';
return cue_name;
psz_cue_name[i++]='C'; psz_cue_name[i++]='U'; psz_cue_name[i++]='E';
return psz_cue_name;
}
}
free(cue_name);
free(psz_cue_name);
return NULL;
}
@@ -1179,15 +1241,15 @@ cdio_open_bincue (const char *source_name)
free(bin_name);
return cdio_open_cue(source_name);
} else {
char *cue_name = cdio_is_binfile(source_name);
CdIo *cdio = cdio_open_cue(cue_name);
free(cue_name);
char *psz_cue_name = cdio_is_binfile(source_name);
CdIo *cdio = cdio_open_cue(psz_cue_name);
free(psz_cue_name);
return cdio;
}
}
CdIo *
cdio_open_cue (const char *cue_name)
cdio_open_cue (const char *psz_cue_name)
{
CdIo *ret;
_img_private_t *_data;
@@ -1218,24 +1280,25 @@ cdio_open_cue (const char *cue_name)
.stat_size = _stat_size_bincue
};
if (NULL == cue_name) return NULL;
if (NULL == psz_cue_name) return NULL;
_data = _cdio_malloc (sizeof (_img_private_t));
(_data)->gen.init = false;
(_data)->sector_2336 = false;
(_data)->cue_name = NULL;
(_data)->psz_cue_name = NULL;
ret = cdio_new (_data, &_funcs);
if (ret == NULL) return NULL;
bin_name = cdio_is_cuefile(cue_name);
bin_name = cdio_is_cuefile(psz_cue_name);
if (NULL == bin_name) {
cdio_error ("source name %s is not recognized as a CUE file", cue_name);
cdio_error ("source name %s is not recognized as a CUE file",
psz_cue_name);
}
_set_arg_bincue (_data, "cue", cue_name);
_set_arg_bincue (_data, "cue", psz_cue_name);
_set_arg_bincue (_data, "source", bin_name);
free(bin_name);