From af1712a32547b98185813bf28dd6bbaa45b956a3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 9 May 2008 05:25:04 +0000 Subject: [PATCH] Fix memory stomp that's turning the whole buildfarm pink: you can't hack up pg_wcsformat without changing pg_wcssize to match. Add some comments to try to make that clearer, and make a couple other minor editorializations. --- src/bin/psql/mbprint.c | 40 +++++++++++++++++++++++++--------------- src/bin/psql/mbprint.h | 3 ++- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/bin/psql/mbprint.c b/src/bin/psql/mbprint.c index d274b4a774..23e14d95a6 100644 --- a/src/bin/psql/mbprint.c +++ b/src/bin/psql/mbprint.c @@ -205,12 +205,15 @@ pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding) * pg_wcssize takes the given string in the given encoding and returns three * values: * result_width: Width in display characters of the longest line in string - * result_height: Number of newlines in display output - * result_format_size: Number of bytes required to store formatted representation of string + * result_height: Number of lines in display output + * result_format_size: Number of bytes required to store formatted + * representation of string + * + * This MUST be kept in sync with pg_wcsformat! */ -int -pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width, - int *result_height, int *result_format_size) +void +pg_wcssize(unsigned char *pwcs, size_t len, int encoding, + int *result_width, int *result_height, int *result_format_size) { int w, chlen = 0, @@ -241,6 +244,14 @@ pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width, linewidth += 2; format_size += 2; } + else if (*pwcs == '\t') /* Tab */ + { + do + { + linewidth++; + format_size++; + } while (linewidth % 8 != 0); + } else if (w < 0) /* Other control char */ { linewidth += 4; @@ -266,7 +277,7 @@ pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width, } if (linewidth > width) width = linewidth; - format_size += 1; + format_size += 1; /* For NUL char */ /* Set results */ if (result_width) @@ -275,14 +286,13 @@ pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *result_width, *result_height = height; if (result_format_size) *result_format_size = format_size; - - return width; } /* - * Filter out unprintable characters, companion to wcs_size. - * Break input into lines based on \n. lineptr[i].ptr == NULL - * indicates the end of the array. + * Format a string into one or more "struct lineptr" lines. + * lines[i].ptr == NULL indicates the end of the array. + * + * This MUST be kept in sync with pg_wcssize! */ void pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, @@ -309,7 +319,7 @@ pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, linewidth = 0; lines++; count--; - if (count == 0) + if (count <= 0) exit(1); /* Screwup */ /* make next line point to remaining memory */ @@ -346,14 +356,14 @@ pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, if (encoding == PG_UTF8) sprintf((char *) ptr, "\\u%04X", utf2ucs(pwcs)); else - + { /* * This case cannot happen in the current code because only * UTF-8 signals multibyte control characters. But we may need * to support it at some stage */ sprintf((char *) ptr, "\\u????"); - + } ptr += 6; linewidth += 6; } @@ -370,7 +380,7 @@ pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, lines->width = linewidth; *ptr++ = '\0'; /* Terminate formatted string */ - if (count == 0) + if (count <= 0) exit(1); /* Screwup */ (lines+1)->ptr = NULL; /* terminate line array */ diff --git a/src/bin/psql/mbprint.h b/src/bin/psql/mbprint.h index 98230ad860..af4a3d772f 100644 --- a/src/bin/psql/mbprint.h +++ b/src/bin/psql/mbprint.h @@ -13,6 +13,7 @@ extern unsigned char *mbvalidate(unsigned char *pwcs, int encoding); extern int pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding); extern void pg_wcsformat(unsigned char *pwcs, size_t len, int encoding, struct lineptr * lines, int count); -extern int pg_wcssize(unsigned char *pwcs, size_t len, int encoding, int *width, int *height, int *format_size); +extern void pg_wcssize(unsigned char *pwcs, size_t len, int encoding, + int *width, int *height, int *format_size); #endif /* MBPRINT_H */ -- 2.39.5