[U-Boot-Users] [PATCH] Add flash programming counter]

Jerry Van Baren
2008-03-06T19:35:21Z

Michael Schwingen wrote:
> Wolfgang Denk wrote:
>> Please let's stay terse. Printing a dot is a single character on the
>> console. I dislike funny stuff which requires output of non-printing
>> characters or (weven worse!) terminal specific escape sequences.
>>
> Backspace or CR without LF should work on all terminals, no?
>
> No matter how it is implemented, I am strongly in favor of *some* kind
> of progress output.
>
> If it is possible to estimate how long the operation will take, this
> would be a big plus IMHO (which precludes the simple dots).
>
> cu
> Michael

Hi Michael, Stefan, Wolfgang,

I understand where you are coming from and like countdowns a lot when
driving the system from a terminal.

The dark side of countdowns with \r characters is if you capture it in a
log file. It isn't impossibly bad, but you end up with a lot of crap in
your log file.

The dark side of dots, as you point out, is that you don't know how many
dots are suppose to print, at least the first couple of times you do it.

Here is a thought, what about printing a bar and then print the dots.
How sophisticated is our printf() formatting capabilities? Hmmm. How
about something like this (I think the?

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
int k;
int cnt;

if(sscanf(argv[1], "%d", &cnt) != 1) {
fprintf(stderr, "sscanf() failed\n");
return 0;
} else {

printf("%*c\r", (cnt + (1 << 14) - 1) / (1 << 14), '|');
fflush(stdout);

for(k = 0; k < cnt; k++) {
if ((k % (1 << 14)) == 0) {
sleep(1);
putchar('.');
fflush(stdout);
}
}
printf("\n");
}
return 0;
}

Example use:

After three dots are printed:
./dots 491520
... |

At the end:
> ./dots 491520
..............................

Note that, if our printf() doesn't understand the '*' modifier, it could
still be done with a static string that is at least as long as the
expected length. That would be much less desirable, however, because it
is hard to guess what the maximum length string should be.

The above also is a little iffy with line wrapping if you have more than
79 dots.

Using '\r' rather than '\n' on the progress bar is on the iffy side. It
looks cool on a video terminal, but '\n' is a safer choice. It also has
less problems with line wrapping (ugly, but still understandable).
Substituting
printf("%*c\n", (cnt + (1 << 14) - 1) / (1 << 14), '|');
looks like:
> ./dots 491520
|
..............................

Best regards,
gvb