If getcols() returns 0, we were getting stuck before in a loop of no
return. Teach getcols() to take a default value to return if the width
is unknown, and use this everywhere as appropriate.

Also make a few other cleanups while diagnosing this issue, such as
const-ifying some variables.

Noticed-by: Dave Reisner <[email protected]>
Signed-off-by: Dan McGee <[email protected]>
---

Slightly updated to be more elegant with the default width returned. This also
allows us to const-ify calls to getcols() everywhere, as well as not call it
multiple times in the callback functions as we did before.

This is for maint; one minor adjustment to a table_display function will need
to be made when merging to master.

-Dan

 src/pacman/callback.c |   18 +++++++++++-------
 src/pacman/util.c     |   20 +++++++++-----------
 src/pacman/util.h     |    2 +-
 3 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 5edcc96..46ff2e8 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -351,7 +351,9 @@ void cb_trans_progress(pmtransprog_t event, const char 
*pkgname, int percent,
        int len, wclen, wcwid, padwid;
        wchar_t *wcstr;
 
-       if(config->noprogressbar) {
+       const int cols = getcols(0);
+
+       if(config->noprogressbar || cols == 0) {
                return;
        }
 
@@ -397,7 +399,7 @@ void cb_trans_progress(pmtransprog_t event, const char 
*pkgname, int percent,
                        return;
        }
 
-       infolen = getcols() * 6 / 10;
+       infolen = cols * 6 / 10;
        if (infolen < 50) {
                infolen = 50;
        }
@@ -454,7 +456,7 @@ void cb_trans_progress(pmtransprog_t event, const char 
*pkgname, int percent,
        free(wcstr);
 
        /* call refactored fill progress function */
-       fill_progress(percent, percent, getcols() - infolen);
+       fill_progress(percent, percent, cols - infolen);
 
        if(percent == 100) {
                alpm_list_t *i = NULL;
@@ -497,7 +499,9 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
        int file_percent = 0, total_percent = 0;
        char rate_size = 'K', xfered_size = 'K';
 
-       if(config->noprogressbar || file_total == -1) {
+       const int cols = getcols(0);
+
+       if(config->noprogressbar || cols == 0 || file_total == -1) {
                if(file_xfered == 0) {
                        printf(_("downloading %s...\n"), filename);
                        fflush(stdout);
@@ -505,7 +509,7 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
                return;
        }
 
-       infolen = getcols() * 6 / 10;
+       infolen = cols * 6 / 10;
        if (infolen < 50) {
                infolen = 50;
        }
@@ -662,9 +666,9 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
        free(wcfname);
 
        if(totaldownload) {
-               fill_progress(file_percent, total_percent, getcols() - infolen);
+               fill_progress(file_percent, total_percent, cols - infolen);
        } else {
-               fill_progress(file_percent, file_percent, getcols() - infolen);
+               fill_progress(file_percent, file_percent, cols - infolen);
        }
        return;
 }
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 3d26803..508cc89 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -101,7 +101,7 @@ int needs_root(void)
 }
 
 /* gets the current screen column width */
-int getcols(void)
+int getcols(int def)
 {
 #ifdef TIOCGSIZE
        struct ttysize win;
@@ -114,7 +114,7 @@ int getcols(void)
                return win.ws_col;
        }
 #endif
-       return 0;
+       return def;
 }
 
 /* does the same thing as 'rm -rf' */
@@ -209,14 +209,13 @@ void indentprint(const char *str, int indent)
 {
        wchar_t *wcstr;
        const wchar_t *p;
-       int len, cidx, cols;
+       int len, cidx;
+       const int cols = getcols(0);
 
        if(!str) {
                return;
        }
 
-       cols = getcols();
-
        /* if we're not a tty, print without indenting */
        if(cols == 0) {
                printf("%s", str);
@@ -425,8 +424,6 @@ static int string_length(const char *s)
 
 void string_display(const char *title, const char *string)
 {
-       int len = 0;
-
        if(title) {
                printf("%s ", title);
        }
@@ -434,7 +431,7 @@ void string_display(const char *title, const char *string)
                printf(_("None"));
        } else {
                /* compute the length of title + a space */
-               len = string_length(title) + 1;
+               int len = string_length(title) + 1;
                indentprint(string, len);
        }
        printf("\n");
@@ -443,7 +440,7 @@ void string_display(const char *title, const char *string)
 void list_display(const char *title, const alpm_list_t *list)
 {
        const alpm_list_t *i;
-       int cols, len = 0;
+       int len = 0;
 
        if(title) {
                len = string_length(title) + 1;
@@ -453,11 +450,12 @@ void list_display(const char *title, const alpm_list_t 
*list)
        if(!list) {
                printf("%s\n", _("None"));
        } else {
+               int cols;
+               const int maxcols = getcols(80);
                for(i = list, cols = len; i; i = alpm_list_next(i)) {
                        char *str = alpm_list_getdata(i);
                        int s = string_length(str);
-                       int maxcols = getcols();
-                       if(maxcols > 0 && (cols + s + 2) >= maxcols) {
+                       if(cols + s + 2 >= maxcols) {
                                int j;
                                cols = len;
                                printf("\n");
diff --git a/src/pacman/util.h b/src/pacman/util.h
index 234a631..53176fa 100644
--- a/src/pacman/util.h
+++ b/src/pacman/util.h
@@ -42,7 +42,7 @@
 int trans_init(pmtransflag_t flags);
 int trans_release(void);
 int needs_root(void);
-int getcols(void);
+int getcols(int def);
 int rmrf(const char *path);
 const char *mbasename(const char *path);
 char *mdirname(const char *path);
-- 
1.7.5.2


Reply via email to