Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions include/share/grabbag/file.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,23 @@ FLAC__bool grabbag__file_remove_file(const char *filename);
FILE *grabbag__file_get_binary_stdin(void);
FILE *grabbag__file_get_binary_stdout(void);

/* input/stdin reader that works correctly on Windows console */
struct grabbag__file_input_reader {
FILE *stream;
char *buf;
size_t pos;
size_t size;
size_t maxsize;
wchar_t surrogate_buffer;
FLAC__bool eof;
FLAC__bool force_utf8;
FLAC__bool error;
};
typedef struct grabbag__file_input_reader grabbag__file_input_reader;
void grabbag__file_input_reader_open(grabbag__file_input_reader *input_reader, FILE *stream);
void grabbag__file_input_reader_close(grabbag__file_input_reader *input_reader);
FLAC__bool grabbag__file_input_reader_next_line(grabbag__file_input_reader *input_reader, char **line);

#ifdef __cplusplus
}
#endif
Expand Down
2 changes: 0 additions & 2 deletions src/flac/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +326,6 @@ static int main_to_fuzz(int argc, char *argv[])
fprintf(stderr, "ERROR: failed to convert command line parameters to UTF-8\n");
return 1;
}
SetConsoleOutputCP(CP_UTF8);
_setmode(fileno(stderr),_O_U8TEXT);
#endif

#ifdef HAVE_SYS_TIME_H
Expand Down
4 changes: 4 additions & 0 deletions src/flac/vorbiscomment.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ static FLAC__bool set_vc_field(FLAC__StreamMetadata *block, const Argument_VcFie
}

/* move 'data' into 'converted', converting to UTF-8 if necessary */
#ifdef _WIN32
converted = data;
#else
if(raw) {
converted = data;
}
Expand All @@ -153,6 +156,7 @@ static FLAC__bool set_vc_field(FLAC__StreamMetadata *block, const Argument_VcFie
*violation = "error converting file contents to UTF-8 for tag value";
return false;
}
#endif

/* create and entry and append it */
if(!FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(&entry, field->field_name, converted)) {
Expand Down
33 changes: 5 additions & 28 deletions src/metaflac/operations.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,11 @@ FLAC__bool do_operations(const CommandLineOptions *options)
FLAC__bool ok = true;

#ifdef _WIN32
if(options->utf8_convert) {
_setmode(fileno(stdout),_O_U8TEXT);
SetConsoleOutputCP(CP_UTF8);
}
fflush(stdout);
fflush(stderr);
_setmode(fileno(stdin), _O_BINARY);
_setmode(fileno(stdout), _O_BINARY);
_setmode(fileno(stderr), _O_BINARY);
#endif

if(options->show_long_help) {
Expand Down Expand Up @@ -215,12 +216,6 @@ FLAC__bool do_major_operation__list(const char *filename, FLAC__Metadata_Chain *
return false;
}
write_metadata_binary(block, block_raw, options->data_format_is_binary_headerless);
#ifdef _WIN32
if(options->utf8_convert)
_setmode(fileno(stdout),_O_U8TEXT);
else
_setmode(fileno(stdin),_O_TEXT);
#endif
free(block_raw);
}
}
Expand Down Expand Up @@ -276,10 +271,6 @@ FLAC__bool do_major_operation__append(FLAC__Metadata_Chain *chain, const Command
break;
}

#ifdef _WIN32
_setmode(fileno(stdin),_O_BINARY);
#endif

/* Read header from stdin */
while(fread(header, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, stdin) == FLAC__STREAM_METADATA_HEADER_LENGTH) {

Expand Down Expand Up @@ -342,13 +333,6 @@ FLAC__bool do_major_operation__append(FLAC__Metadata_Chain *chain, const Command
}
}

#ifdef _WIN32
if(options->utf8_convert)
_setmode(fileno(stdout),_O_U8TEXT);
else
_setmode(fileno(stdin),_O_TEXT);
#endif

if(num_objects == 0)
flac_fprintf(stderr, "ERROR: unable to find a metadata block in the supplied input\n");

Expand Down Expand Up @@ -852,17 +836,10 @@ void write_metadata(const char *filename, FLAC__StreamMetadata *block, unsigned

void write_metadata_binary(FLAC__StreamMetadata *block, FLAC__byte *block_raw, FLAC__bool headerless)
{
#ifdef _WIN32
fflush(stdout);
_setmode(fileno(stdout),_O_BINARY);
#endif
if(!headerless)
local_fwrite(block_raw, 1, block->length+FLAC__STREAM_METADATA_HEADER_LENGTH, stdout);
else if(block->type == FLAC__METADATA_TYPE_APPLICATION && block->length > 3)
local_fwrite(block_raw+FLAC__STREAM_METADATA_HEADER_LENGTH+4, 1, block->length-4, stdout);
else
local_fwrite(block_raw+FLAC__STREAM_METADATA_HEADER_LENGTH, 1, block->length, stdout);
#ifdef _WIN32
fflush(stdout);
#endif
}
77 changes: 40 additions & 37 deletions src/metaflac/operations_shorthand_vorbiscomment.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ FLAC__bool remove_vc_firstfield(const char *filename, FLAC__StreamMetadata *bloc
FLAC__bool set_vc_field(const char *filename, FLAC__StreamMetadata *block, const Argument_VcField *field, FLAC__bool *needs_write, FLAC__bool raw)
{
FLAC__StreamMetadata_VorbisComment_Entry entry;
char *converted;
char *converted = NULL;

FLAC__ASSERT(0 != block);
FLAC__ASSERT(block->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
Expand Down Expand Up @@ -270,6 +270,9 @@ FLAC__bool set_vc_field(const char *filename, FLAC__StreamMetadata *block, const
}

/* move 'data' into 'converted', converting to UTF-8 if necessary */
#if defined _WIN32
converted = data;
#else
if(raw) {
converted = data;
}
Expand All @@ -281,6 +284,7 @@ FLAC__bool set_vc_field(const char *filename, FLAC__StreamMetadata *block, const
flac_fprintf(stderr, "%s: ERROR: converting file '%s' contents to UTF-8 for tag value\n", filename, field->field_value);
return false;
}
#endif

/* create and entry and append it */
if(!FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(&entry, field->field_name, converted)) {
Expand All @@ -300,6 +304,7 @@ FLAC__bool set_vc_field(const char *filename, FLAC__StreamMetadata *block, const
else {
FLAC__bool needs_free = false;
entry.entry = (FLAC__byte *)field->field;
#if !defined _WIN32
if(raw) {
entry.entry = (FLAC__byte *)field->field;
}
Expand All @@ -311,6 +316,7 @@ FLAC__bool set_vc_field(const char *filename, FLAC__StreamMetadata *block, const
flac_fprintf(stderr, "%s: ERROR: converting comment '%s' to UTF-8\n", filename, field->field);
return false;
}
#endif
entry.length = strlen((const char *)entry.entry);
if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) {
if(needs_free)
Expand Down Expand Up @@ -340,15 +346,16 @@ FLAC__bool set_vc_field(const char *filename, FLAC__StreamMetadata *block, const
FLAC__bool import_vc_from(const char *filename, FLAC__StreamMetadata *block, const Argument_String *vc_filename, FLAC__bool *needs_write, FLAC__bool raw)
{
FILE *f;
char line[65536];
char* line = NULL;
grabbag__file_input_reader input_reader[1];
FLAC__bool ret;

if(0 == vc_filename->value || strlen(vc_filename->value) == 0) {
flac_fprintf(stderr, "%s: ERROR: empty import file name\n", filename);
return false;
}
if(0 == strcmp(vc_filename->value, "-"))
f = stdin;
f = grabbag__file_get_binary_stdin();
else
f = flac_fopen(vc_filename->value, "r");

Expand All @@ -358,42 +365,38 @@ FLAC__bool import_vc_from(const char *filename, FLAC__StreamMetadata *block, con
}

ret = true;
while(ret && !feof(f) && fgets(line, sizeof(line), f) != NULL) {
char *p = strpbrk(line, "\r\n");
if(0 == p) {
const size_t len = strlen(line);
if(len < (sizeof(line) - 1)) {
/* Likely missing newline in the last line, allow this */
p = &line[len];
}
else {
flac_fprintf(stderr, "%s: ERROR: line too long, aborting\n", vc_filename->value);
ret = false;
}
}

if(ret) {
const char *violation;
Argument_VcField field;
*p = '\0';
memset(&field, 0, sizeof(Argument_VcField));
field.field_value_from_file = false;
if(!parse_vorbis_comment_field(line, &field.field, &field.field_name, &field.field_value, &field.field_value_length, &violation)) {
FLAC__ASSERT(0 != violation);
flac_fprintf(stderr, "%s: ERROR: malformed vorbis comment field \"%s\",\n %s\n", vc_filename->value, line, violation);
ret = false;
}
else {
ret = set_vc_field(filename, block, &field, needs_write, raw);
}
if(0 != field.field)
free(field.field);
if(0 != field.field_name)
free(field.field_name);
if(0 != field.field_value)
free(field.field_value);
grabbag__file_input_reader_open(input_reader, f);
input_reader->force_utf8 = raw;

while(grabbag__file_input_reader_next_line(input_reader, &line)) {
const char *violation;
Argument_VcField field;
memset(&field, 0, sizeof(Argument_VcField));
field.field_value_from_file = false;
if(!parse_vorbis_comment_field(line, &field.field, &field.field_name, &field.field_value, &field.field_value_length, &violation)) {
FLAC__ASSERT(0 != violation);
flac_fprintf(stderr, "%s: ERROR: malformed vorbis comment field \"%s\",\n %s\n", vc_filename->value, line, violation);
ret = false;
}
};
else {
ret = set_vc_field(filename, block, &field, needs_write, raw);
}
if(0 != field.field)
free(field.field);
if(0 != field.field_name)
free(field.field_name);
if(0 != field.field_value)
free(field.field_value);
}

if(input_reader->error)
{
flac_fprintf(stderr, "%s: ERROR: line too long, aborting\n", vc_filename->value);
ret = false;
}

grabbag__file_input_reader_close(input_reader);

if(f != stdin)
fclose(f);
Expand Down
Loading
Loading