return ret;
}
-static char *local__get_field_(char **s)
+static char *local__get_field_(char **s, FLAC__bool allow_quotes)
{
+ FLAC__bool has_quote = false;
char *p;
FLAC__ASSERT(0 != s);
while(**s && 0 != strchr(" \t\r\n", **s))
(*s)++;
- if(**s == 0)
+ if(**s == 0) {
*s = 0;
+ return 0;
+ }
+
+ if(allow_quotes && (**s == '"')) {
+ has_quote = true;
+ (*s)++;
+ if(**s == 0) {
+ *s = 0;
+ return 0;
+ }
+ }
p = *s;
- if(p) {
+ if(has_quote) {
+ *s = strchr(*s, '\"');
+ /* if there is no matching end quote, it's an error */
+ if(0 == *s)
+ p = *s = 0;
+ else {
+ **s = '\0';
+ (*s)++;
+ }
+ }
+ else {
while(**s && 0 == strchr(" \t\r\n", **s))
(*s)++;
if(**s) {
return false;
}
- if(0 != (field = local__get_field_(&line))) {
+ if(0 != (field = local__get_field_(&line, /*allow_quotes=*/false))) {
if(0 == FLAC__STRCASECMP(field, "CATALOG")) {
if(disc_has_catalog) {
*error_message = "found multiple CATALOG commands";
return false;
}
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/true))) {
*error_message = "CATALOG is missing catalog number";
return false;
}
*error_message = "FLAGS command must come after TRACK but before INDEX";
return false;
}
- while(0 != (field = local__get_field_(&line))) {
+ while(0 != (field = local__get_field_(&line, /*allow_quotes=*/false))) {
if(0 == FLAC__STRCASECMP(field, "PRE"))
cs->tracks[cs->num_tracks-1].pre_emphasis = 1;
}
*error_message = "found INDEX before any TRACK";
return false;
}
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "INDEX is missing index number";
return false;
}
return false;
}
/*@@@ search for duplicate track number? */
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "INDEX is missing an offset after the index number";
return false;
}
*error_message = "ISRC command must come after TRACK but before INDEX";
return false;
}
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "ISRC is missing ISRC number";
return false;
}
return false;
}
}
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "TRACK is missing track number";
return false;
}
return false;
}
/*@@@ search for duplicate track number? */
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "TRACK is missing a track type after the track number";
return false;
}
track_has_isrc = false;
}
else if(0 == FLAC__STRCASECMP(field, "REM")) {
- if(0 != (field = local__get_field_(&line))) {
+ if(0 != (field = local__get_field_(&line, /*allow_quotes=*/false))) {
if(0 == strcmp(field, "FLAC__lead-in")) {
FLAC__int64 xx;
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "FLAC__lead-in is missing offset";
return false;
}
*error_message = "multiple FLAC__lead-out commands";
return false;
}
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "FLAC__lead-out is missing track number";
return false;
}
}
forced_leadout_track_num = (unsigned)track_num;
/*@@@ search for duplicate track number? */
- if(0 == (field = local__get_field_(&line))) {
+ if(0 == (field = local__get_field_(&line, /*allow_quotes=*/false))) {
*error_message = "FLAC__lead-out is missing offset";
return false;
}