chiark / gitweb /
better progress indication
[ypp-sc-tools.main.git] / pctb / convert.c
index f38abf5a0d2dc6b0c91eaa4fd3e78a271e581bda..cd9c6521976385498e72311d84631432a5d10bbf 100644 (file)
@@ -10,11 +10,20 @@ void debug_flush(void) {
 
 const char *get_vardir(void) { return "."; }
 
+static enum {
+  mf_findwindow=    01,
+  mf_screenshot=    02,
+  mf_analyse=       04,
+  
+  mode_findwindow=  01,
+  mode_screenshot=  03,
+  mode_analyse=     04,
+
+  mode_all=         07,
+} o_mode= mode_all;
 
-static enum { mode_all=03, mode_screenshot=01, mode_analyse=02 }
-    o_mode= mode_all;
 static char *o_screenshots_fn;
-static int o_single_page;
+static int o_single_page, o_quiet;
 
 FILE *screenshots_file;
 
@@ -23,14 +32,23 @@ int main(int argc, char **argv) {
   int r;
 
   while ((arg=*++argv)) {
-    if (!strcmp(arg,"--screenshots-only"))
+    if (!strcmp(arg,"--find-window-only"))
+      o_mode= mode_findwindow;
+    else if (!strcmp(arg,"--screenshot-only"))
       o_mode= mode_screenshot;
     else if (!strcmp(arg,"--analyse-only"))
       o_mode= mode_analyse;
     else if (!strcmp(arg,"--single-page"))
       o_single_page= 1;
+    else if (!strcmp(arg,"--quiet"))
+      o_quiet= 1;
     else if (!strcmp(arg,"--screenshots-file"))
       eassert( o_screenshots_fn= *++argv );
+#define DF(f)                                  \
+    else if (!strcmp(arg,"-D" #f))             \
+      debug_flags |= dbg_##f;
+    DEBUG_FLAG_LIST
+#undef DF
     else if (!strcmp(arg,"--window-id")) {
       char *ep;
       eassert((arg=*++argv));
@@ -46,21 +64,76 @@ int main(int argc, char **argv) {
     eassert(r>=0);  eassert(o_screenshots_fn);
   }
 
-  if (o_mode & mode_screenshot) {
+  if (o_mode & mf_findwindow) {
     screenshot_startup();
     find_yppclient_window();
+  }
+  if (o_mode & mf_screenshot) {
     screenshots_file= fopen(o_screenshots_fn, "w"); eassert(screenshots_file);
-    if (o_single_page)
-      take_one_screenshot();
-    else
-      take_screenshots();
+    if (o_single_page) take_one_screenshot();
+    else take_screenshots();
   } else {
     screenshots_file= fopen(o_screenshots_fn, "r"); eassert(screenshots_file);
-    read_screenshots();
+    if (o_single_page) read_one_screenshot();
+    else read_screenshots();
   }
-  if (o_mode & mode_analyse) {
+  if (o_mode & mf_analyse) {
     analyse();
     //output_tsv();
   }
   return 0;
 }
+
+
+
+
+DEFINE_VWRAPPERF(, progress)
+DEFINE_VWRAPPERF(, progress_log)
+DEFINE_VWRAPPERF(, progress_spinner)
+
+static int last_progress_len;
+     
+static void vprogress_core(int spinner, const char *fmt, va_list al) {
+  int r;
+  
+  if (o_quiet) return;
+  if (!isatty(2)) return;
+  
+  if (last_progress_len)
+    putc('\r',stderr);
+
+  r= vfprintf(stderr,fmt,al);
+  eassert(r>=0);
+
+  if (spinner) {
+    putc(spinner,stderr);
+    r++;
+  }
+
+  if (r < last_progress_len) {
+    fprintf(stderr,"%*s", last_progress_len - r, "");
+    if (!r) putc('\r', stderr);
+    else while (last_progress_len-- > r) putc('\b',stderr);
+  }
+  last_progress_len= r;
+  fflush(stderr);
+}
+   
+void vprogress(const char *fmt, va_list al) { vprogress_core(0,fmt,al); }
+void vprogress_spinner(const char *fmt, va_list al) {
+  static const char spinchars[]="/-\\";
+  static int spinner;
+
+  vprogress_core(spinchars[spinner],fmt,al);
+  spinner++;
+  spinner %= (sizeof(spinchars)-1);
+}
+
+void vprogress_log(const char *fmt, va_list al) {
+  if (o_quiet) return;
+  
+  progress("");
+  vfprintf(stderr,fmt,al);
+  putc('\n',stderr);
+  fflush(stderr);
+}