Bump to version 1.22.1
[platform/upstream/busybox.git] / libbb / progress.c
index 1062e9a..372feb0 100644 (file)
@@ -52,12 +52,18 @@ static unsigned int get_tty2_width(void)
        return width;
 }
 
-void FAST_FUNC bb_progress_init(bb_progress_t *p)
+void FAST_FUNC bb_progress_init(bb_progress_t *p, const char *curfile)
 {
+#if ENABLE_UNICODE_SUPPORT
+       init_unicode();
+       p->curfile = unicode_conv_to_printable_fixedwidth(/*NULL,*/ curfile, 20);
+#else
+       p->curfile = curfile;
+#endif
        p->start_sec = monotonic_sec();
-       p->lastupdate_sec = p->start_sec;
-       p->lastsize = 0;
-       p->inited = 1;
+       p->last_update_sec = p->start_sec;
+       p->last_change_sec = p->start_sec;
+       p->last_size = 0;
 }
 
 /* File already had beg_size bytes.
@@ -68,19 +74,21 @@ void FAST_FUNC bb_progress_init(bb_progress_t *p)
  * If totalsize == 0, then it is unknown.
  */
 void FAST_FUNC bb_progress_update(bb_progress_t *p,
-               const char *curfile,
                uoff_t beg_size,
                uoff_t transferred,
                uoff_t totalsize)
 {
        uoff_t beg_and_transferred;
        unsigned since_last_update, elapsed;
-       unsigned ratio;
        int barlength;
        int kiloscale;
 
+       //transferred = 1234; /* use for stall detection testing */
+       //totalsize = 0; /* use for unknown size download testing */
+
        elapsed = monotonic_sec();
-       since_last_update = elapsed - p->lastupdate_sec;
+       since_last_update = elapsed - p->last_update_sec;
+       p->last_update_sec = elapsed;
 
        if (totalsize != 0 && transferred >= totalsize - beg_size) {
                /* Last call. Do not skip this update */
@@ -119,37 +127,37 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p,
                /* 32-bit CPU and 64-bit off_t.
                 * Use a 40-bit shift, it is easier to do on 32-bit CPU.
                 */
-               if (totalsize >= (uoff_t)(1ULL << 54)) {
-                       totalsize = (uint32_t)(totalsize >> 32) >> 8;
-                       beg_size = (uint32_t)(beg_size >> 32) >> 8;
-                       transferred = (uint32_t)(transferred >> 32) >> 8;
+/* ONE suppresses "warning: shift count >= width of type" */
+#define ONE (sizeof(off_t) > 4)
+               if (totalsize >= (uoff_t)(1ULL << 54*ONE)) {
+                       totalsize = (uint32_t)(totalsize >> 32*ONE) >> 8;
+                       beg_size = (uint32_t)(beg_size >> 32*ONE) >> 8;
+                       transferred = (uint32_t)(transferred >> 32*ONE) >> 8;
                        kiloscale = 4;
                }
        }
 
-       beg_and_transferred = beg_size + transferred;
+       if (ENABLE_UNICODE_SUPPORT)
+               fprintf(stderr, "\r%s", p->curfile);
+       else
+               fprintf(stderr, "\r%-20.20s", p->curfile);
 
-       ratio = 100 * beg_and_transferred / totalsize;
-#if ENABLE_UNICODE_SUPPORT
-       init_unicode();
-       {
-               char *buf = unicode_conv_to_printable_fixedwidth(/*NULL,*/ curfile, 20);
-               fprintf(stderr, "\r%s%4u%% ", buf, ratio);
-               free(buf);
-       }
-#else
-       fprintf(stderr, "\r%-20.20s%4u%% ", curfile, ratio);
-#endif
+       beg_and_transferred = beg_size + transferred;
 
-       barlength = get_tty2_width() - 49;
-       if (barlength > 0) {
-               /* god bless gcc for variable arrays :) */
-               char buf[barlength + 1];
-               unsigned stars = (unsigned)barlength * beg_and_transferred / totalsize;
-               memset(buf, ' ', barlength);
-               buf[barlength] = '\0';
-               memset(buf, '*', stars);
-               fprintf(stderr, "|%s|", buf);
+       if (totalsize != 0) {
+               unsigned ratio = 100 * beg_and_transferred / totalsize;
+               fprintf(stderr, "%4u%%", ratio);
+
+               barlength = get_tty2_width() - 49;
+               if (barlength > 0) {
+                       /* god bless gcc for variable arrays :) */
+                       char buf[barlength + 1];
+                       unsigned stars = (unsigned)barlength * beg_and_transferred / totalsize;
+                       memset(buf, ' ', barlength);
+                       buf[barlength] = '\0';
+                       memset(buf, '*', stars);
+                       fprintf(stderr, " |%s|", buf);
+               }
        }
 
        while (beg_and_transferred >= 100000) {
@@ -160,9 +168,10 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p,
        fprintf(stderr, "%6u%c", (unsigned)beg_and_transferred, " kMGTPEZY"[kiloscale]);
 #define beg_and_transferred dont_use_beg_and_transferred_below()
 
-       if (transferred != p->lastsize) {
-               p->lastupdate_sec = elapsed;
-               p->lastsize = transferred;
+       since_last_update = elapsed - p->last_change_sec;
+       if ((unsigned)transferred != p->last_size) {
+               p->last_change_sec = elapsed;
+               p->last_size = (unsigned)transferred;
                if (since_last_update >= STALLTIME) {
                        /* We "cut out" these seconds from elapsed time
                         * by adjusting start time */
@@ -175,7 +184,7 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p,
 
        if (since_last_update >= STALLTIME) {
                fprintf(stderr, "  - stalled -");
-       } else if (!totalsize || !transferred || (int)elapsed <= 0) {
+       } else if (!totalsize || !transferred || (int)elapsed < 0) {
                fprintf(stderr, " --:--:-- ETA");
        } else {
                unsigned eta, secs, hours;