From 0380de9781313e504e609f95ff776f075e208c5c Mon Sep 17 00:00:00 2001
From: Fredrik Noring <noring@nocrew.org>
Date: Wed, 30 Aug 2000 15:45:30 +0200
Subject: [PATCH] New progress system. Stderr is redirected to a file called
 dumpmodule.log.

Rev: src/dumpmodule.pike:1.13
---
 src/dumpmodule.pike | 84 +++++++++++++++++++++++++++++++--------------
 1 file changed, 59 insertions(+), 25 deletions(-)

diff --git a/src/dumpmodule.pike b/src/dumpmodule.pike
index 92fcaea845..21236c19eb 100755
--- a/src/dumpmodule.pike
+++ b/src/dumpmodule.pike
@@ -12,8 +12,60 @@ string fakeroot(string s)
 #define fakeroot(X) X
 #endif
 
+class ProgressBar
+{
+  private constant width = 45;
+
+  private float phase_base, phase_size;
+  private int max, cur;
+  private string name;
+
+  void set_current(int _cur)
+  {
+    cur = _cur;
+  }
+
+  void set_phase(float _phase_base, float _phase_size)
+  {
+    phase_base = _phase_base;
+    phase_size = _phase_size;
+  }
+  
+  void update(int increment)
+  {
+    cur += increment;
+    cur = min(cur, max);
+    
+    float ratio = phase_base + ((float)cur/(float)max) * phase_size;
+    if(1.0 < ratio)
+      ratio = 1.0;
+    
+    int bar = (int)(ratio * (float)width);
+    int is_full = (bar == width);
+    
+    write("\r   %-13s |%s%c%s%s %4.1f %%  ",
+	  name+":",
+	  "="*bar,
+	  is_full ? '|' : ({ '\\', '|', '/', '-' })[cur & 3],
+	  is_full ? "" : " "*(width-bar-1),
+	  is_full ? "" : "|",
+	  100.0 * ratio);
+  }
 
+  void create(string _name, int _cur, int _max,
+	      float|void _phase_base, float|void _phase_size)
+    /* NOTE: max must be greater than zero. */
+  {
+    name = _name;
+    max = _max;
+    cur = _cur;
+    
+    phase_base = _phase_base || 0.0;
+    phase_size = _phase_size || 1.0 - phase_base;
+  }
+}
 
+ProgressBar progress_bar;
 
 #define error(X) throw( ({ (X), backtrace() }) )
 
@@ -231,30 +283,11 @@ void dumpit(string file)
   }
 }
 
-constant progress_width = 45;
-
-int progress_bar    = 0;
-int progress_offset = 0;
-int progress_max    = 0;
-
-void update_progress(string name, int cur, int max)
-{
-    float ratio = (float)cur/(float)max;
-    int bar = (int)(ratio * (float)progress_width);
-
-    int is_full = bar == progress_width;
-    
-    werror("\r   %s: |%s%c%s%s %4.1f %%  ",
-	   name,
-	   "="*bar,
-	   is_full ? '|' : ({ '\\', '|', '/', '-' })[cur & 3],
-	   is_full ? "" : " "*(progress_width-bar-1),
-	   is_full ? "" : "|",
-	   100.0 * ratio);
-}
-
 int main(int argc, string *argv)
 {
+  /* Redirect all debug and error messages to a logfile. */
+  Stdio.File("dumpmodule.log", "caw")->dup2(Stdio.stderr);
+  
   foreach( (array)all_constants(), [string name, mixed func])
     function_names[func]="efun:"+name;
 
@@ -290,8 +323,9 @@ int main(int argc, string *argv)
       quiet = 2;
       logfile = Stdio.File("dumpmodule.log","caw");
       
-      progress_bar = 1;
-      sscanf(argv[1], "%d,%d", progress_offset, progress_max);
+      progress_bar = ProgressBar("Precompiling",
+				 @array_sscanf(argv[1], "%d,%d"),
+				 0.2, 0.8);
       
       argv = argv[2..];
   }
@@ -299,7 +333,7 @@ int main(int argc, string *argv)
   foreach(argv, string file)
   {
     if(progress_bar)
-      update_progress("Precompiling", progress_offset++, progress_max);
+      progress_bar->update(1);
       
     dumpit(file);
   }
-- 
GitLab