From 2483f77ff5a17344ebf22aaabc2e3cd3d207060a Mon Sep 17 00:00:00 2001
From: Richard Nyberg <rnyberg@murmeldjur.se>
Date: Sat, 16 Sep 2006 10:08:25 +0000
Subject: [PATCH] Reprint the header at suitable intervals. Display sizes >=
 1000MB in gigs instead of megs. Similarily, display rates >= 1000kB/s in MB/s
 instead of kB/s.

---
 cli/stat.c | 58 ++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 45 insertions(+), 13 deletions(-)

diff --git a/cli/stat.c b/cli/stat.c
index 2af1210..d7bdd31 100644
--- a/cli/stat.c
+++ b/cli/stat.c
@@ -59,23 +59,47 @@ static enum ipc_tval stkeys[] = {
 
 static size_t nstkeys = sizeof(stkeys) / sizeof(stkeys[0]);
 
+static void
+print_percent(long long part, long long whole)
+{
+    printf("%5.1f%% ", floor(1000.0 * part / whole) / 10);
+}
+
+static void
+print_rate(long long rate)
+{
+    if (rate >= (1000 << 10))
+        printf("%6.2fMB/s ", (double)rate / (1 << 20));
+    else
+        printf("%6.2fkB/s ", (double)rate / (1 << 10));
+
+}
+
+static void
+print_size(long long size)
+{
+    if (size >= (1000 << 20))
+        printf("%6.2fG ", (double)size / (1 << 30));
+    else
+        printf("%6.2fM ", (double)size / (1 << 20));
+}
+
 static void
 print_stat(struct btstat *st)
 {
-    printf("%5.1f%% %6.1fM %7.2fkB/s %6.1fM %7.2fkB/s %5u %5.1f%%",
-        floor(1000.0 * st->content_got / st->content_size) / 10,
-        (double)st->downloaded / (1 << 20),
-        (double)st->rate_down / (20 << 10),
-        (double)st->uploaded / (1 << 20),
-        (double)st->rate_up / (20 << 10),
-        st->peers,
-        floor(1000.0 * st->pieces_seen / st->torrent_pieces) / 10);
+    print_percent(st->content_got, st->content_size);
+    print_size(st->downloaded);
+    print_rate(st->rate_down / 20);
+    print_size(st->uploaded);
+    print_rate(st->rate_up / 20);
+    printf("%5u ", st->peers);
+    print_percent(st->pieces_seen, st->torrent_pieces);
     if (st->tr_errors > 0)
-        printf(" E%u", st->tr_errors);
+        printf("E%u", st->tr_errors);
     printf("\n");
 }
 
-void
+static void
 stat_cb(int obji, enum ipc_err objerr, struct ipc_get_res *res, void *arg)
 {
     struct cbarg *cba = arg;
@@ -116,14 +140,22 @@ do_stat(int individual, int names, int seconds, struct ipc_torrent *tps,
 {
     enum ipc_err err;
     struct cbarg cba;
+    int header = 1;
     if (names)
         individual = 1;
-    if (individual)
-        printf("NUM    ST ");
-    printf("  HAVE   DLOAD       RTDWN   ULOAD        RTUP PEERS  AVAIL\n");
     cba.individual = individual;
     cba.names = names;
 again:
+    header--;
+    if (header == 0) {
+        if (individual) {
+            header = 1;
+            printf("NUM    ST ");
+        } else
+            header = 20;
+        printf("  HAVE   DLOAD      RTDWN   ULOAD       RTUP PEERS  AVAIL\n");
+    }
+
     bzero(&cba.tot, sizeof(cba.tot));
     cba.tot.state = IPC_TSTATE_INACTIVE;
     if (tps == NULL)