Fix conflict progress bar with UTF-8 chars

This fixes FS#6437. Dan already explained the problem in that bug report.

Instead of letting printf deal with the length of utf8 strings, we can
handle it more explicitly in the case of conflict progress bar, just like we
do for add/remove progress bars. We compute the remaining space left for
displaying the pkgname in case of add/remove, and an empty string in case of
conflict.

Before :
(1/1) Prüfe auf Dateikonflikte                 [###################] 100%
(1/1) Aktualisiere rxvt-unicode                 [###################] 100%
After :
(1/1) Prüfe auf Dateikonflikte                  [###################] 100%
(1/1) Aktualisiere rxvt-unicode                 [###################] 100%

Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Chantry Xavier 2008-02-17 23:31:26 +01:00 committed by Dan McGee
parent 42f5579fd7
commit 2374c81e55

View file

@ -329,9 +329,8 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent,
/* size of line to allocate for text printing (e.g. not progressbar) */ /* size of line to allocate for text printing (e.g. not progressbar) */
const int infolen = 50; const int infolen = 50;
int tmp, digits, oprlen, textlen, pkglen; int tmp, digits, oprlen, textlen, remainlen;
char *opr = NULL; char *opr = NULL;
wchar_t *wcopr = NULL;
if(config->noprogressbar) { if(config->noprogressbar) {
return; return;
@ -373,15 +372,6 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent,
opr = _("checking for file conflicts"); opr = _("checking for file conflicts");
break; break;
} }
/* convert above strings to wide chars */
oprlen = strlen(opr);
wcopr = calloc(oprlen, sizeof(wchar_t));
if(!wcopr) {
fprintf(stderr, "malloc failure: could not allocate %zd bytes\n",
strlen(opr) * sizeof(wchar_t));
return;
}
oprlen = mbstowcs(wcopr, opr, oprlen);
/* find # of digits in package counts to scale output */ /* find # of digits in package counts to scale output */
digits = 1; digits = 1;
@ -392,30 +382,24 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent,
/* determine room left for non-digits text [not ( 1/12) part] */ /* determine room left for non-digits text [not ( 1/12) part] */
textlen = infolen - 3 - (2 * digits); textlen = infolen - 3 - (2 * digits);
/* room left for package name */
pkglen = textlen - oprlen - 1; oprlen = mbstowcs(NULL, opr, 0);
/* room left (eg for package name) */
remainlen = textlen - oprlen - 1;
switch (event) { switch (event) {
case PM_TRANS_PROGRESS_ADD_START: case PM_TRANS_PROGRESS_ADD_START:
case PM_TRANS_PROGRESS_UPGRADE_START: case PM_TRANS_PROGRESS_UPGRADE_START:
case PM_TRANS_PROGRESS_REMOVE_START: case PM_TRANS_PROGRESS_REMOVE_START:
/* old way of doing it, but ISO C does not recognize it
printf("(%2$*1$d/%3$*1$d) %4$s %6$-*5$.*5$s", digits, remain, howmany,
opr, pkglen, pkgname);*/
printf("(%*d/%*d) %s %-*.*s", digits, remain, digits, howmany, printf("(%*d/%*d) %s %-*.*s", digits, remain, digits, howmany,
opr, pkglen, pkglen, pkgname); opr, remainlen, remainlen, pkgname);
break; break;
case PM_TRANS_PROGRESS_CONFLICTS_START: case PM_TRANS_PROGRESS_CONFLICTS_START:
/* old way of doing it, but ISO C does not recognize it printf("(%*d/%*d) %s %-*s", digits, remain, digits, howmany,
printf("(%2$*1$d/%3$*1$d) %5$-*4$s", digits, remain, howmany, opr, remainlen, "");
textlen, opr);*/
printf("(%*d/%*d) %-*s", digits, remain, digits, howmany,
textlen, opr);
break; break;
} }
free(wcopr);
/* call refactored fill progress function */ /* call refactored fill progress function */
fill_progress(percent, percent, getcols() - infolen); fill_progress(percent, percent, getcols() - infolen);