123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #include "libbb.h"
- #include "unicode.h"
- enum {
-
- STALLTIME = 5
- };
- 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( curfile, 20);
- #else
- p->curfile = curfile;
- #endif
- p->start_sec = monotonic_sec();
- p->last_update_sec = p->start_sec;
- p->last_change_sec = p->start_sec;
- p->last_size = 0;
- }
- void FAST_FUNC bb_progress_update(bb_progress_t *p,
- uoff_t beg_size,
- uoff_t transferred,
- uoff_t totalsize)
- {
- uoff_t beg_and_transferred;
- unsigned since_last_update, elapsed;
- int notty;
- int kiloscale;
-
-
- elapsed = monotonic_sec();
- since_last_update = elapsed - p->last_update_sec;
- p->last_update_sec = elapsed;
- if (totalsize != 0 && transferred >= totalsize - beg_size) {
-
- transferred = totalsize - beg_size;
- }
- else if (since_last_update == 0) {
-
- return;
- }
- kiloscale = 0;
-
- if (ULONG_MAX > 0xffffffff || sizeof(off_t) == 4 || sizeof(off_t) != 8) {
-
- if (totalsize >= (1 << 22)) {
- totalsize >>= 10;
- beg_size >>= 10;
- transferred >>= 10;
- kiloscale = 1;
- }
- } else {
-
- #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;
- }
- }
- notty = !isatty(STDERR_FILENO);
- if (ENABLE_UNICODE_SUPPORT)
- fprintf(stderr, "\r%s" + notty, p->curfile);
- else
- fprintf(stderr, "\r%-20.20s" + notty, p->curfile);
- beg_and_transferred = beg_size + transferred;
- if (totalsize != 0) {
- int barlength;
- unsigned ratio = 100 * beg_and_transferred / totalsize;
- fprintf(stderr, "%4u%%", ratio);
- barlength = get_terminal_width(2) - 49;
- if (barlength > 0) {
-
- 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) {
- beg_and_transferred >>= 10;
- kiloscale++;
- }
-
- fprintf(stderr, "%6u%c", (unsigned)beg_and_transferred, " kMGTPEZY"[kiloscale]);
- #define beg_and_transferred dont_use_beg_and_transferred_below()
- 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) {
-
- p->start_sec += since_last_update;
- }
- since_last_update = 0;
- }
- elapsed -= p->start_sec;
- if (since_last_update >= STALLTIME) {
- fprintf(stderr, " - stalled -");
- } else if (!totalsize || !transferred || (int)elapsed < 0) {
- fprintf(stderr, " --:--:-- ETA");
- } else {
- unsigned eta, secs, hours;
- totalsize -= beg_size;
-
- eta = totalsize * elapsed / transferred - elapsed;
- if (eta >= 1000*60*60)
- eta = 1000*60*60 - 1;
- secs = eta % 3600;
- hours = eta / 3600;
- fprintf(stderr, "%3u:%02u:%02u ETA", hours, secs / 60, secs % 60);
- }
- if (notty)
- fputc('\n', stderr);
- }
|