Modified the calc_rate function to calculate bandwidth in powers of ten
(SI-prefix format)
  for --bits option.

 Please review the changes

  Thanks
  Sasi

---------- Forwarded message ----------
From: Sasikanth <sasikanth....@gmail.com>
Date: Wed, Jan 18, 2012 at 5:43 PM
Subject: Re: [Bug-wget] [PATCH] [wget-bug #33210], Add an option to output
bandwidth in bits
To: Hrvoje Niksic <hnik...@xemacs.org>
Cc: bug-wget@gnu.org


On Sun, Jan 15, 2012 at 8:51 PM, Hrvoje Niksic <hnik...@xemacs.org> wrote:

> Sasikanth <sasikanth....@gmail.com> writes:
>
> > No one asked. i had just thought it will be good to display all the
> output
> > in either bits or bytes to avoid confusion to the user (I had
> > confused).
>
> I understand that, but I have never seen a downloading agent output data
> length in bits, so displaying the data in bits would likely cause much
> more confusion and/or be less useful.  (Data throughput in bits, on the
> other hand, is quite common.)  With the original implementation of
> --bits I expect that someone would soon ask for
> --bits-for-bandwidth-only.
>
> > Anyhow thanks I will modify the patch.
>
> Thanks.
>
> Note that the patch has another problem: while Wget's "K", "M", and "G"
> refer to (what is now known as) kibibytes, mebibytes, and gibibytes,
> bandwidth is measured in kilobits, megabits, and gigabits per second.
> Bandwidth units all refer to powers of ten, not to powers of two, so it
> is incorrect for calc_rate to simply increase the byte multipliers by 8.
>
> Hrvoje
>

  Modified the calc_rate function to calculate bandwidth in powers of ten
(SI-prefix format)
  for --bits option.

 Please review the changes

  Thanks
  Sasi
diff -ur orig/wget-1.13.4/src/init.c wget-1.13.4/src/init.c
--- orig/wget-1.13.4/src/init.c 2011-08-19 15:36:20.000000000 +0530
+++ wget-1.13.4/src/init.c      2012-01-18 14:42:56.240973950 +0530
@@ -126,6 +126,7 @@
   { "backups",          &opt.backups,           cmd_number },
   { "base",             &opt.base_href,         cmd_string },
   { "bindaddress",      &opt.bind_address,      cmd_string },
+  { "bits",             &opt.bits_fmt,          cmd_boolean},
 #ifdef HAVE_SSL
   { "cacertificate",    &opt.ca_cert,           cmd_file },
 #endif
diff -ur orig/wget-1.13.4/src/main.c wget-1.13.4/src/main.c
--- orig/wget-1.13.4/src/main.c 2011-09-06 19:20:11.000000000 +0530
+++ wget-1.13.4/src/main.c      2012-01-18 14:42:56.241973599 +0530
@@ -166,6 +166,7 @@
     { "backups", 0, OPT_BOOLEAN, "backups", -1 },
     { "base", 'B', OPT_VALUE, "base", -1 },
     { "bind-address", 0, OPT_VALUE, "bindaddress", -1 },
+    { "bits", 0, OPT_BOOLEAN, "bits", -1 },
     { IF_SSL ("ca-certificate"), 0, OPT_VALUE, "cacertificate", -1 },
     { IF_SSL ("ca-directory"), 0, OPT_VALUE, "cadirectory", -1 },
     { "cache", 0, OPT_BOOLEAN, "cache", -1 },
@@ -704,6 +705,11 @@
   -np, --no-parent                 don't ascend to the parent directory.\n"),
     "\n",
 
+    N_("\
+Output format:\n"),
+    N_("\
+       --bits                      Output bandwidth in bits.\n"),
+    "\n",
     N_("Mail bug reports and suggestions to <bug-wget@gnu.org>.\n")
   };
 
diff -ur orig/wget-1.13.4/src/options.h wget-1.13.4/src/options.h
--- orig/wget-1.13.4/src/options.h      2011-08-06 15:54:32.000000000 +0530
+++ wget-1.13.4/src/options.h   2012-01-18 14:42:56.247982676 +0530
@@ -255,6 +255,7 @@
 
   bool show_all_dns_entries; /* Show all the DNS entries when resolving a
                                 name. */
+  bool bits_fmt;              /*Output bandwidth in bits format*/
 };
 
 extern struct options opt;
diff -ur orig/wget-1.13.4/src/progress.c wget-1.13.4/src/progress.c
--- orig/wget-1.13.4/src/progress.c     2011-01-01 17:42:35.000000000 +0530
+++ wget-1.13.4/src/progress.c  2012-01-18 14:42:56.249098685 +0530
@@ -861,7 +861,7 @@
   struct bar_progress_hist *hist = &bp->hist;
 
   /* The progress bar should look like this:
-     xx% [=======>             ] nn,nnn 12.34K/s  eta 36m 51s
+     xx% [=======>             ] nn,nnn 12.34KB/s  eta 36m 51s
 
      Calculate the geometry.  The idea is to assign as much room as
      possible to the progress bar.  The other idea is to never let
@@ -873,7 +873,7 @@
      "xx% " or "100%"  - percentage               - 4 chars
      "[]"              - progress bar decorations - 2 chars
      " nnn,nnn,nnn"    - downloaded bytes         - 12 chars or very rarely 
more
-     " 12.5K/s"        - download rate             - 8 chars
+     " 12.5KB/s"        - download rate           - 9 chars
      "  eta 36m 51s"   - ETA                      - 14 chars
 
      "=====>..."       - progress bar             - the rest
@@ -977,10 +977,11 @@
       *p++ = ' ';
     }
 
-  /* " 12.52K/s" */
+  /* " 12.52Kb/s or 12.52KB/s" */
   if (hist->total_time > 0 && hist->total_bytes)
     {
-      static const char *short_units[] = { "B/s", "K/s", "M/s", "G/s" };
+      static const char *short_units[] = { "B/s", "KB/s", "MB/s", "GB/s" };
+      static const char *short_units_bits[] = { "b/s", "Kb/s", "Mb/s", "Gb/s" 
};
       int units = 0;
       /* Calculate the download speed using the history ring and
          recent data that hasn't made it to the ring yet.  */
@@ -988,7 +989,7 @@
       double dltime = hist->total_time + (dl_total_time - bp->recent_start);
       double dlspeed = calc_rate (dlquant, dltime, &units);
       sprintf (p, " %4.*f%s", dlspeed >= 99.95 ? 0 : dlspeed >= 9.995 ? 1 : 2,
-               dlspeed, short_units[units]);
+               dlspeed,  
!opt.bits_fmt?short_units[units]:short_units_bits[units]);
       move_to_end (p);
     }
   else
diff -ur orig/wget-1.13.4/src/retr.c wget-1.13.4/src/retr.c
--- orig/wget-1.13.4/src/retr.c 2011-08-30 19:17:33.000000000 +0530
+++ wget-1.13.4/src/retr.c      2012-01-18 17:27:18.383987006 +0530
@@ -578,6 +578,7 @@
 {
   static char res[20];
   static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
+  static const char *rate_names_bits[] = {"b/s", "Kb/s", "Mb/s", "Gb/s" };
   int units;
 
   double dlrate = calc_rate (bytes, secs, &units);
@@ -585,7 +586,7 @@
      e.g. "1022", "247", "12.5", "2.38".  */
   sprintf (res, "%.*f %s",
            dlrate >= 99.95 ? 0 : dlrate >= 9.995 ? 1 : 2,
-           dlrate, rate_names[units]);
+           dlrate, !opt.bits_fmt? rate_names[units]: rate_names_bits[units]);
 
   return res;
 }
@@ -602,6 +603,13 @@
 calc_rate (wgint bytes, double secs, int *units)
 {
   double dlrate;
+  double bibyte = 1000.0;
+ 
+  if (!opt.bits_fmt)
+    {
+      bibyte = 1024.0;
+    }
+
 
   assert (secs >= 0);
   assert (bytes >= 0);
@@ -613,16 +621,17 @@
        0 and the timer's resolution, assume half the resolution.  */
     secs = ptimer_resolution () / 2.0;
 
-  dlrate = bytes / secs;
-  if (dlrate < 1024.0)
+  dlrate = convert_to_bits (bytes) / secs;
+  if (dlrate < bibyte)
     *units = 0;
-  else if (dlrate < 1024.0 * 1024.0)
-    *units = 1, dlrate /= 1024.0;
-  else if (dlrate < 1024.0 * 1024.0 * 1024.0)
-    *units = 2, dlrate /= (1024.0 * 1024.0);
+  else if (dlrate < (bibyte * bibyte))
+    *units = 1, dlrate /= bibyte;
+  else if (dlrate < (bibyte * bibyte * bibyte))
+    *units = 2, dlrate /= (bibyte * bibyte);
+
   else
     /* Maybe someone will need this, one day. */
-    *units = 3, dlrate /= (1024.0 * 1024.0 * 1024.0);
+    *units = 3, dlrate /= (bibyte * bibyte * bibyte);
 
   return dlrate;
 }
diff -ur orig/wget-1.13.4/src/utils.c wget-1.13.4/src/utils.c
--- orig/wget-1.13.4/src/utils.c        2011-08-29 13:31:24.000000000 +0530
+++ wget-1.13.4/src/utils.c     2012-01-18 14:42:56.253098685 +0530
@@ -1826,6 +1826,17 @@
   ringpos = (ringpos + 1) % RING_SIZE;
   return buf;
 }
+
+/* Converts the byte to bits format if --bits option is enabled
+ */
+wgint
+convert_to_bits (wgint num)
+{
+  if (opt.bits_fmt)
+    return num * 8;
+  return num;
+}
+
 
 /* Determine the width of the terminal we're running on.  If that's
    not possible, return 0.  */
2012-01-18   Sasikantha babu   <sasikanth....@gmail.com>
        * utils.c (convert_to_bits): Added new function convert_to_bits to
                  convert bytes to bits
        * retr.c (calc_rate): Modified the function to handle --bits option
          and download rate calculated as bits per sec (SI-prefix) for --bits 
otherwise 
          bytes (IEC-prefix).
                (retr_rate): Rates will display in bits per sec for --bits
        * options.h (struct opt): Added --bit option bool variable bits_fmt
        * main.c (print_help) : Added help for --bit
        * init.c: Defined command for --bit option

Reply via email to