[pacman-dev] [PATCH] Ensure list_display works on outputs of unknown width

Dan McGee dan at archlinux.org
Wed Jun 1 16:01:11 EDT 2011


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 <d at falconindy.com>
Signed-off-by: Dan McGee <dan at archlinux.org>
---

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



More information about the pacman-dev mailing list