cli/utils.c | 34 +++++++++++++++++++++++++--------- cli/wavpack.c | 58 +++++++++++++++++++++++++++++++++++++--------------------- cli/wvgain.c | 34 +++++++++++++++++++++++++--------- cli/wvtag.c | 30 +++++++++++++++++++++++------- cli/wvunpack.c | 46 +++++++++++++++++++++++++++++++--------------- 5 files changed, 141 insertions(+), 61 deletions(-) diff --git a/cli/utils.c b/cli/utils.c index d59bad0..8840032 100644 --- a/cli/utils.c +++ b/cli/utils.c @@ -38,6 +38,22 @@ #define remove(f) unlink_utf8(f) #endif +#ifdef _MSC_VER +static __inline void flush_pipe(FILE *const stream) +{ + struct _stat stat; + if (!_fstat(_fileno(stream), &stat)) + { + if ((stat.st_mode & _S_IFMT) == _S_IFIFO) + { + fflush(stream); /*flush iff it is a pipe*/ + } + } +} +#else +#define flush_pipe(X) ((void)0) +#endif + #ifdef _WIN32 int copy_timestamp (const char *src_filename, const char *dst_filename) @@ -325,38 +341,38 @@ char yna (void) else if (key == '\r' || key == '\n') { if (choice) { fprintf (stderr, "\r\n"); - fflush (stderr); + flush_pipe (stderr); break; } else { fprintf (stderr, "%c", 7); - fflush (stderr); + flush_pipe (stderr); } } else if (key == 'Y' || key == 'y') { #ifdef _WIN32 fprintf (stderr, "%c\b", key); - fflush (stderr); + flush_pipe (stderr); #endif choice = 'y'; } else if (key == 'N' || key == 'n') { #ifdef _WIN32 fprintf (stderr, "%c\b", key); - fflush (stderr); + flush_pipe (stderr); #endif choice = 'n'; } else if (key == 'A' || key == 'a') { #ifdef _WIN32 fprintf (stderr, "%c\b", key); - fflush (stderr); + flush_pipe (stderr); #endif choice = 'a'; } else { fprintf (stderr, "%c", 7); - fflush (stderr); + flush_pipe (stderr); } } @@ -557,7 +573,7 @@ void finish_line (void) else fprintf (stderr, " \n"); - fflush (stderr); + flush_pipe (stderr); } #else ////////////////////////////////////////////////////////////////////////////// @@ -568,7 +584,7 @@ void finish_line (void) void finish_line (void) { fprintf (stderr, " \n"); - fflush (stderr); + flush_pipe (stderr); } ////////////////////////////////////////////////////////////////////////////// @@ -763,7 +779,7 @@ void DoSetConsoleTitle (char *text) void DoSetConsoleTitle (char *text) { fprintf (stderr, "\033]0;%s\007", text); - fflush (stderr); + flush_pipe (stderr); } #endif diff --git a/cli/wavpack.c b/cli/wavpack.c index 4d46aba..f33086f 100644 --- a/cli/wavpack.c +++ b/cli/wavpack.c @@ -61,6 +61,22 @@ #define stricmp strcasecmp #endif +#ifdef _MSC_VER +static __inline void flush_pipe(FILE *const stream) +{ + struct _stat stat; + if (!_fstat(_fileno(stream), &stat)) + { + if ((stat.st_mode & _S_IFMT) == _S_IFIFO) + { + fflush(stream); /*flush iff it is a pipe*/ + } + } +} +#else +#define flush_pipe(X) ((void)0) +#endif + ///////////////////////////// local variable storage ////////////////////////// static const char *sign_on = "\n" @@ -882,11 +898,11 @@ int main (int argc, char **argv) if (strcmp (WavpackGetLibraryVersionString (), PACKAGE_VERSION)) { fprintf (stderr, version_warning, WavpackGetLibraryVersionString (), PACKAGE_VERSION); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode && !error_count) { fprintf (stderr, sign_on, VERSION_OS, WavpackGetLibraryVersionString ()); - fflush (stderr); + flush_pipe (stderr); } // Loop through any tag specification strings and check for file access, convert text @@ -1004,7 +1020,7 @@ int main (int argc, char **argv) if (error_count) { fprintf (stderr, "\ntype 'wavpack' for short help or 'wavpack --help' for full help\n"); - fflush (stderr); + flush_pipe (stderr); return 1; } @@ -1261,7 +1277,7 @@ int main (int argc, char **argv) if (num_files > 1 && !quiet_mode) { fprintf (stderr, "\n%s:\n", matches [file_index]); - fflush (stderr); + flush_pipe (stderr); } if (filespec_ext (matches [file_index]) && !stricmp (filespec_ext (matches [file_index]), ".wv")) @@ -1295,11 +1311,11 @@ int main (int argc, char **argv) if (num_files > 1) { if (error_count) { fprintf (stderr, "\n **** warning: errors occurred in %d of %d files! ****\n", error_count, num_files); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode) { fprintf (stderr, "\n **** %d files successfully processed ****\n", num_files); - fflush (stderr); + flush_pipe (stderr); } } @@ -1350,7 +1366,7 @@ int main(int argc, char **argv) if (pause_mode) { fprintf (stderr, "\nPress any key to continue . . . "); - fflush (stderr); + flush_pipe (stderr); while (!_kbhit ()); _getch (); fprintf (stderr, "\n"); @@ -1604,7 +1620,7 @@ static int pack_file (char *infilename, char *outfilename, char *out2filename, c if (!overwrite_all) { fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (outfilename)); - fflush (stderr); + flush_pipe (stderr); if (set_console_title) DoSetConsoleTitle ("overwrite?"); @@ -1629,7 +1645,7 @@ static int pack_file (char *infilename, char *outfilename, char *out2filename, c if (res == 1) { fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (out2filename)); - fflush (stderr); + flush_pipe (stderr); if (set_console_title) DoSetConsoleTitle ("overwrite?"); @@ -1740,7 +1756,7 @@ static int pack_file (char *infilename, char *outfilename, char *out2filename, c else fprintf (stderr, "creating %s,", FN_FIT (outfilename)); - fflush (stderr); + flush_pipe (stderr); } // for now, raw 1-bit PCM is only DSDIFF format @@ -2364,7 +2380,7 @@ static int pack_audio (WavpackContext *wpc, FILE *infile, int qmode, unsigned ch #else fprintf (stderr, "\n"); #endif - fflush (stderr); + flush_pipe (stderr); free (sample_buffer); free (input_buffer); return WAVPACK_SOFT_ERROR; @@ -2380,7 +2396,7 @@ static int pack_audio (WavpackContext *wpc, FILE *infile, int qmode, unsigned ch if (!quiet_mode) { fprintf (stderr, "%s%3d%% done...", nobs ? " " : "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress); - fflush (stderr); + flush_pipe (stderr); } } } @@ -2522,7 +2538,7 @@ static int pack_dsd_audio (WavpackContext *wpc, FILE *infile, int qmode, unsigne #else fprintf (stderr, "\n"); #endif - fflush (stderr); + flush_pipe (stderr); free (sample_buffer); free (input_buffer); return WAVPACK_SOFT_ERROR; @@ -2538,7 +2554,7 @@ static int pack_dsd_audio (WavpackContext *wpc, FILE *infile, int qmode, unsigne if (!quiet_mode) { fprintf (stderr, "%s%3d%% done...", nobs ? " " : "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress); - fflush (stderr); + flush_pipe (stderr); } } } @@ -2637,7 +2653,7 @@ static int repack_file (char *infilename, char *outfilename, char *out2filename, else fprintf (stderr, "overwrite %s with lossy transcode (yes/no/all)? ", FN_FIT (outfilename)); - fflush (stderr); + flush_pipe (stderr); if (set_console_title) DoSetConsoleTitle ("overwrite?"); @@ -2657,7 +2673,7 @@ static int repack_file (char *infilename, char *outfilename, char *out2filename, if (out2filename && !overwrite_all && (wvc_file.file = fopen (out2filename, "rb")) != NULL) { DoCloseHandle (wvc_file.file); fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (out2filename)); - fflush (stderr); + flush_pipe (stderr); if (set_console_title) DoSetConsoleTitle ("overwrite?"); @@ -2759,7 +2775,7 @@ static int repack_file (char *infilename, char *outfilename, char *out2filename, else fprintf (stderr, "creating %s,", FN_FIT (outfilename)); - fflush (stderr); + flush_pipe (stderr); } WavpackSetFileInformation (outfile, WavpackGetFileExtension (infile), WavpackGetFileFormat (infile)); @@ -3324,7 +3340,7 @@ static int repack_audio (WavpackContext *outfile, WavpackContext *infile, unsign #else fprintf (stderr, "\n"); #endif - fflush (stderr); + flush_pipe (stderr); free (sample_buffer); return WAVPACK_SOFT_ERROR; } @@ -3339,7 +3355,7 @@ static int repack_audio (WavpackContext *outfile, WavpackContext *infile, unsign if (!quiet_mode) { fprintf (stderr, "%s%3d%% done...", nobs ? " " : "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress); - fflush (stderr); + flush_pipe (stderr); } } } @@ -3525,7 +3541,7 @@ static int verify_audio (char *infilename, unsigned char *md5_digest_source) #else fprintf (stderr, "\n"); #endif - fflush (stderr); + flush_pipe (stderr); result = WAVPACK_SOFT_ERROR; break; } @@ -3539,7 +3555,7 @@ static int verify_audio (char *infilename, unsigned char *md5_digest_source) if (!quiet_mode) { fprintf (stderr, "%s%3d%% done...", "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress); - fflush (stderr); + flush_pipe (stderr); } } } diff --git a/cli/wvgain.c b/cli/wvgain.c index 4e789ea..2603824 100644 --- a/cli/wvgain.c +++ b/cli/wvgain.c @@ -57,6 +57,22 @@ #define fopen(f,m) fopen_utf8(f,m) #endif +#ifdef _MSC_VER +static __inline void flush_pipe(FILE *const stream) +{ + struct _stat stat; + if (!_fstat(_fileno(stream), &stat)) + { + if ((stat.st_mode & _S_IFMT) == _S_IFIFO) + { + fflush(stream); /*flush iff it is a pipe*/ + } + } +} +#else +#define flush_pipe(X) ((void)0) +#endif + ///////////////////////////// local variable storage ////////////////////////// static const char *sign_on = "\n" @@ -258,11 +274,11 @@ int main(int argc, char **argv) if (strcmp (WavpackGetLibraryVersionString (), PACKAGE_VERSION)) { fprintf (stderr, version_warning, WavpackGetLibraryVersionString (), PACKAGE_VERSION); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode && !error_count) { fprintf (stderr, sign_on, VERSION_OS, WavpackGetLibraryVersionString ()); - fflush (stderr); + flush_pipe (stderr); } if (!num_files) { @@ -407,7 +423,7 @@ int main(int argc, char **argv) if (num_files > 1 && !quiet_mode) { fprintf (stderr, "\n%s:\n", matches [file_index]); - fflush (stderr); + flush_pipe (stderr); } if (new_mode) { @@ -496,7 +512,7 @@ int main(int argc, char **argv) if (num_files > 1 && !quiet_mode) { fprintf (stderr, "\n%s:\n", matches [file_index]); - fflush (stderr); + flush_pipe (stderr); } if (show_mode) @@ -517,11 +533,11 @@ int main(int argc, char **argv) if (num_files > 1) { if (error_count) { fprintf (stderr, "\n **** warning: errors occurred in %d of %d files! ****\n", error_count, num_files); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode) { fprintf (stderr, "\n **** %d files successfully processed ****\n", num_files); - fflush (stderr); + flush_pipe (stderr); } } @@ -624,7 +640,7 @@ static int analyze_file (char *infilename, uint32_t *histogram, float *peak) if (!quiet_mode) { fprintf (stderr, "analyzing %s%s,", *infilename == '-' ? "stdin" : FN_FIT (infilename), wvc_mode ? " (+.wvc)" : ""); - fflush (stderr); + flush_pipe (stderr); } sample_rate = WavpackGetSampleRate (wpc); @@ -711,7 +727,7 @@ static int analyze_file (char *infilename, uint32_t *histogram, float *peak) #else fprintf (stderr, "\n"); #endif - fflush (stderr); + flush_pipe (stderr); result = WAVPACK_HARD_ERROR; break; } @@ -727,7 +743,7 @@ static int analyze_file (char *infilename, uint32_t *histogram, float *peak) if (!quiet_mode) { fprintf (stderr, "%s%3d%% done...", nobs ? " " : "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress); - fflush (stderr); + flush_pipe (stderr); } } } diff --git a/cli/wvtag.c b/cli/wvtag.c index 6e6512a..33f3526 100644 --- a/cli/wvtag.c +++ b/cli/wvtag.c @@ -60,6 +60,22 @@ #define stricmp strcasecmp #endif +#ifdef _MSC_VER +static __inline void flush_pipe(FILE *const stream) +{ + struct _stat stat; + if (!_fstat(_fileno(stream), &stat)) + { + if ((stat.st_mode & _S_IFMT) == _S_IFIFO) + { + fflush(stream); /*flush iff it is a pipe*/ + } + } +} +#else +#define flush_pipe(X) ((void)0) +#endif + ///////////////////////////// local variable storage ////////////////////////// static const char *sign_on = "\n" @@ -408,11 +424,11 @@ int main (int argc, char **argv) if (strcmp (WavpackGetLibraryVersionString (), PACKAGE_VERSION)) { fprintf (stderr, version_warning, WavpackGetLibraryVersionString (), PACKAGE_VERSION); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode && !error_count) { fprintf (stderr, sign_on, VERSION_OS, WavpackGetLibraryVersionString ()); - fflush (stderr); + flush_pipe (stderr); } // Loop through any tag specification strings and check for file access, convert text @@ -653,7 +669,7 @@ int main (int argc, char **argv) if (num_files > 1 && !quiet_mode) { fprintf (stderr, "\n%s:\n", matches [file_index]); - fflush (stderr); + flush_pipe (stderr); } result = process_file (matches [file_index]); @@ -672,11 +688,11 @@ int main (int argc, char **argv) if (num_files > 1) { if (error_count) { fprintf (stderr, "\n **** warning: errors occurred in %d of %d files! ****\n", error_count, num_files); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode) { fprintf (stderr, "\n **** %d files successfully processed ****\n", num_files); - fflush (stderr); + flush_pipe (stderr); } } @@ -721,7 +737,7 @@ int main(int argc, char **argv) if (pause_mode) { fprintf (stderr, "\nPress any key to continue . . . "); - fflush (stderr); + flush_pipe (stderr); while (!_kbhit ()); _getch (); fprintf (stderr, "\n"); @@ -995,7 +1011,7 @@ static int do_tag_extractions (WavpackContext *wpc, char *outfilename) if (!overwrite_all && (outfile = fopen (full_filename, "r")) != NULL) { DoCloseHandle (outfile); fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (full_filename)); - fflush (stderr); + flush_pipe (stderr); switch (yna ()) { diff --git a/cli/wvunpack.c b/cli/wvunpack.c index 2db1cb3..c0a3c87 100644 --- a/cli/wvunpack.c +++ b/cli/wvunpack.c @@ -58,6 +58,22 @@ #define strdup(x) _strdup(x) #endif +#ifdef _MSC_VER +static __inline void flush_pipe(FILE *const stream) +{ + struct _stat stat; + if (!_fstat(_fileno(stream), &stat)) + { + if ((stat.st_mode & _S_IFMT) == _S_IFIFO) + { + fflush(stream); /*flush iff it is a pipe*/ + } + } +} +#else +#define flush_pipe(X) ((void)0) +#endif + ///////////////////////////// local variable storage ////////////////////////// static const char *sign_on = "\n" @@ -549,11 +565,11 @@ int main(int argc, char **argv) if (strcmp (WavpackGetLibraryVersionString (), PACKAGE_VERSION)) { fprintf (stderr, version_warning, WavpackGetLibraryVersionString (), PACKAGE_VERSION); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode && !error_count) { fprintf (stderr, sign_on, VERSION_OS, WavpackGetLibraryVersionString ()); - fflush (stderr); + flush_pipe (stderr); } if (!num_files) { @@ -763,7 +779,7 @@ int main(int argc, char **argv) if (num_files > 1 && !quiet_mode) { fprintf (stderr, "\n%s:\n", matches [file_index]); - fflush (stderr); + flush_pipe (stderr); } result = unpack_file (matches [file_index], verify_only ? NULL : outfilename, add_extension); @@ -789,11 +805,11 @@ int main(int argc, char **argv) if (num_files > 1) { if (error_count) { fprintf (stderr, "\n **** warning: errors occurred in %d of %d files! ****\n", error_count, num_files); - fflush (stderr); + flush_pipe (stderr); } else if (!quiet_mode) { fprintf (stderr, "\n **** %d files successfully processed ****\n", num_files); - fflush (stderr); + flush_pipe (stderr); } } @@ -844,7 +860,7 @@ int main(int argc, char **argv) if (pause_mode) { fprintf (stderr, "\nPress any key to continue . . . "); - fflush (stderr); + flush_pipe (stderr); while (!_kbhit ()); _getch (); fprintf (stderr, "\n"); @@ -931,7 +947,7 @@ static FILE *open_output_file (char *filename, char **tempfilename) if (!overwrite_all) { fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (filename)); - fflush (stderr); + flush_pipe (stderr); if (set_console_title) DoSetConsoleTitle ("overwrite?"); @@ -1235,12 +1251,12 @@ static int unpack_file (char *infilename, char *outfilename, int add_extension) if (!quiet_mode) { fprintf (stderr, "unpacking %s%s to stdout,", *infilename == '-' ? "stdin" : FN_FIT (infilename), wvc_mode ? " (+.wvc)" : ""); - fflush (stderr); + flush_pipe (stderr); } } else if (!quiet_mode) { fprintf (stderr, "restoring %s,", FN_FIT (outfilename)); - fflush (stderr); + flush_pipe (stderr); } } else { // in verify only mode we don't worry about headers @@ -1249,7 +1265,7 @@ static int unpack_file (char *infilename, char *outfilename, int add_extension) if (!quiet_mode) { fprintf (stderr, "verifying %s%s,", *infilename == '-' ? "stdin" : FN_FIT (infilename), wvc_mode ? " (+.wvc)" : ""); - fflush (stderr); + flush_pipe (stderr); } } @@ -1607,7 +1623,7 @@ static int unpack_audio (WavpackContext *wpc, FILE *outfile, int qmode, unsigned #else fprintf (stderr, "\n"); #endif - fflush (stderr); + flush_pipe (stderr); DoTruncateFile (outfile); result = WAVPACK_SOFT_ERROR; break; @@ -1624,7 +1640,7 @@ static int unpack_audio (WavpackContext *wpc, FILE *outfile, int qmode, unsigned if (!quiet_mode) { fprintf (stderr, "%s%3d%% done...", nobs ? " " : "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress); - fflush (stderr); + flush_pipe (stderr); } } } @@ -1762,7 +1778,7 @@ static int unpack_dsd_audio (WavpackContext *wpc, FILE *outfile, int qmode, unsi #else fprintf (stderr, "\n"); #endif - fflush (stderr); + flush_pipe (stderr); DoTruncateFile (outfile); result = WAVPACK_SOFT_ERROR; break; @@ -1779,7 +1795,7 @@ static int unpack_dsd_audio (WavpackContext *wpc, FILE *outfile, int qmode, unsi if (!quiet_mode) { fprintf (stderr, "%s%3d%% done...", nobs ? " " : "\b\b\b\b\b\b\b\b\b\b\b\b", (int) progress); - fflush (stderr); + flush_pipe (stderr); } } } @@ -1883,7 +1899,7 @@ static int do_tag_extractions (WavpackContext *wpc, char *outfilename) if (!overwrite_all && (outfile = fopen (full_filename, "r")) != NULL) { DoCloseHandle (outfile); fprintf (stderr, "overwrite %s (yes/no/all)? ", FN_FIT (full_filename)); - fflush (stderr); + flush_pipe (stderr); if (set_console_title) DoSetConsoleTitle ("overwrite?");