summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-05-09 05:25:04 +0000
committerTom Lane2008-05-09 05:25:04 +0000
commite1435983b80da1ee7e3efcef9e34657768fb9cab (patch)
treebcafb981c372e646a7bed60396ae68f08b777f14
parentc56b444496b3a4b65b7a89df691b2419dd678ac1 (diff)
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.
-rw-r--r--src/bin/psql/mbprint.c42
-rw-r--r--src/bin/psql/mbprint.h5
2 files changed, 29 insertions, 18 deletions
diff --git a/src/bin/psql/mbprint.c b/src/bin/psql/mbprint.c
index a57c4647181..cc8339d4cf7 100644
--- a/src/bin/psql/mbprint.c
+++ b/src/bin/psql/mbprint.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/mbprint.c,v 1.32 2008/05/08 19:11:36 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/mbprint.c,v 1.33 2008/05/09 05:25:04 tgl Exp $
*
* XXX this file does not really belong in psql/. Perhaps move to libpq?
* It also seems that the mbvalidate function is redundant with existing
@@ -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 61e723cbaef..94f358e4314 100644
--- a/src/bin/psql/mbprint.h
+++ b/src/bin/psql/mbprint.h
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/bin/psql/mbprint.h,v 1.11 2006/10/04 00:30:06 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/bin/psql/mbprint.h,v 1.12 2008/05/09 05:25:04 tgl Exp $ */
#ifndef MBPRINT_H
#define 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 */