summaryrefslogtreecommitdiff
path: root/src/flac/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/flac/utils.c')
-rw-r--r--src/flac/utils.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/flac/utils.c b/src/flac/utils.c
index 91a7f9ed..965ab595 100644
--- a/src/flac/utils.c
+++ b/src/flac/utils.c
@@ -29,6 +29,10 @@
#include "FLAC/assert.h"
#include "FLAC/metadata.h"
#include "share/compat.h"
+#ifndef _WIN32
+#include <wchar.h>
+#include <sys/ioctl.h>
+#endif
const char *CHANNEL_MASK_TAG = "WAVEFORMATEXTENSIBLE_CHANNEL_MASK";
@@ -158,6 +162,95 @@ void flac__utils_printf(FILE *stream, int level, const char *format, ...)
}
}
+/* variables and functions for console status output */
+static FLAC__bool is_name_printed;
+static int stats_char_count = 0;
+static int console_width;
+static int console_chars_left;
+
+int get_console_width()
+{
+ int width = 80;
+#ifdef _WIN32
+ width = win_get_console_width();
+#else
+ struct winsize w;
+ if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1) width = w.ws_col;
+#endif
+ return width;
+}
+
+size_t strlen_console(const char *text)
+{
+#ifdef _WIN32
+ return strlen_utf8(text);
+#else
+ size_t len;
+ wchar_t *wtmp;
+
+ len = strlen(text)+1;
+ wtmp = (wchar_t *)malloc(len*sizeof(wchar_t));
+ if (wtmp == NULL) return len-1;
+ mbstowcs(wtmp, text, len);
+ len = wcswidth(wtmp, len);
+ free(wtmp);
+
+ return len;
+#endif
+}
+
+void stats_new_file()
+{
+ is_name_printed = false;
+}
+
+void stats_clear()
+{
+ while (stats_char_count > 0 && stats_char_count--)
+ fprintf(stderr, "\b");
+}
+
+void stats_print_name(int level, const char *name)
+{
+ int len;
+
+ if (flac__utils_verbosity_ >= level) {
+ stats_clear();
+ if(is_name_printed) return;
+
+ console_width = get_console_width();
+ len = strlen_console(name)+2;
+ console_chars_left = console_width - (len % console_width);
+ flac_fprintf(stderr, "%s: ", name);
+ is_name_printed = true;
+ }
+}
+
+void stats_print_info(int level, const char *format, ...)
+{
+ char tmp[80];
+ int len, cleared_len;
+
+ if (flac__utils_verbosity_ >= level) {
+ va_list args;
+ va_start(args, format);
+ len = vsnprintf(tmp, sizeof(tmp), format, args);
+ va_end(args);
+ if (len < 0 || len == sizeof(tmp)) {
+ tmp[sizeof(tmp)-1] = '\0';
+ len = sizeof(tmp)-1;
+ }
+ cleared_len = stats_char_count;
+ stats_clear();
+ if (len >= console_chars_left) {
+ while (cleared_len > 0 && cleared_len--) fprintf(stderr, " ");
+ fprintf(stderr, "\n");
+ console_chars_left = console_width;
+ }
+ stats_char_count = fprintf(stderr, "%s", tmp);
+ }
+}
+
#ifdef FLAC__VALGRIND_TESTING
size_t flac__utils_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
{