]> granicus.if.org Git - postgresql/commitdiff
Fix indentation of \d footers for non-ASCII cases.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 8 Mar 2012 00:25:59 +0000 (19:25 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 8 Mar 2012 00:25:59 +0000 (19:25 -0500)
Multi-line "Inherits:" and "Child tables:" footers were misindented when
those strings' translations involved multibyte characters, because we were
using strlen() instead of an appropriate display width measurement.

In passing, avoid doing gettext() more than once per loop in these places.

While at it, fix pg_wcswidth(), which has been entirely broken since about
8.2, but fortunately has been unused for the same length of time.

Report and patch by Sergey Burladyan (bug #6480)

src/bin/psql/describe.c
src/bin/psql/mbprint.c
src/bin/psql/mbprint.h

index 4eee4be96e0ee845e7824257564c532408272709..75709afedece9d6857c4ad0314138b704947c5dd 100644 (file)
@@ -2156,22 +2156,28 @@ describeOneTableDetails(const char *schemaname,
                if (!result)
                        goto error_return;
                else
-                       tuples = PQntuples(result);
-
-               for (i = 0; i < tuples; i++)
                {
                        const char *s = _("Inherits");
+                       int                     sw = pg_wcswidth(s, strlen(s), pset.encoding);
 
-                       if (i == 0)
-                               printfPQExpBuffer(&buf, "%s: %s", s, PQgetvalue(result, i, 0));
-                       else
-                               printfPQExpBuffer(&buf, "%*s  %s", (int) strlen(s), "", PQgetvalue(result, i, 0));
-                       if (i < tuples - 1)
-                               appendPQExpBuffer(&buf, ",");
+                       tuples = PQntuples(result);
 
-                       printTableAddFooter(&cont, buf.data);
+                       for (i = 0; i < tuples; i++)
+                       {
+                               if (i == 0)
+                                       printfPQExpBuffer(&buf, "%s: %s",
+                                                                         s, PQgetvalue(result, i, 0));
+                               else
+                                       printfPQExpBuffer(&buf, "%*s  %s",
+                                                                         sw, "", PQgetvalue(result, i, 0));
+                               if (i < tuples - 1)
+                                       appendPQExpBuffer(&buf, ",");
+
+                               printTableAddFooter(&cont, buf.data);
+                       }
+
+                       PQclear(result);
                }
-               PQclear(result);
 
                /* print child tables */
                if (pset.sversion >= 80300)
@@ -2198,6 +2204,7 @@ describeOneTableDetails(const char *schemaname,
                {
                        /* display the list of child tables */
                        const char *ct = _("Child tables");
+                       int                     ctw = pg_wcswidth(ct, strlen(ct), pset.encoding);
 
                        for (i = 0; i < tuples; i++)
                        {
@@ -2206,8 +2213,7 @@ describeOneTableDetails(const char *schemaname,
                                                                          ct, PQgetvalue(result, i, 0));
                                else
                                        printfPQExpBuffer(&buf, "%*s  %s",
-                                                                         (int) strlen(ct), "",
-                                                                         PQgetvalue(result, i, 0));
+                                                                         ctw, "", PQgetvalue(result, i, 0));
                                if (i < tuples - 1)
                                        appendPQExpBuffer(&buf, ",");
 
index 32fc756efe5d17acbb3a1e9506df28f169f82299..d43973e96a005d57580dab6067ee5e2b8b4a21fb 100644 (file)
@@ -168,11 +168,12 @@ mb_utf_validate(unsigned char *pwcs)
  */
 
 /*
- * pg_wcswidth is the dumb width function. It assumes that everything will
- * only appear on one line. OTOH it is easier to use if this applies to you.
+ * pg_wcswidth is the dumb display-width function.
+ * It assumes that everything will appear on one line.
+ * OTOH it is easier to use than pg_wcssize if this applies to you.
  */
 int
-pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding)
+pg_wcswidth(const char *pwcs, size_t len, int encoding)
 {
        int                     width = 0;
 
@@ -181,15 +182,16 @@ pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding)
                int                     chlen,
                                        chwidth;
 
-               chlen = PQmblen((const char *) pwcs, encoding);
-               if (chlen > len)
+               chlen = PQmblen(pwcs, encoding);
+               if (len < (size_t) chlen)
                        break;                          /* Invalid string */
 
-               chwidth = PQdsplen((const char *) pwcs, encoding);
-
+               chwidth = PQdsplen(pwcs, encoding);
                if (chwidth > 0)
                        width += chwidth;
+
                pwcs += chlen;
+               len -= chlen;
        }
        return width;
 }
index 83050ffcd7ee7d9a0fc25d625a66ac54746348d7..01064d3100748c5866f7c941902b76b519d03084 100644 (file)
@@ -10,7 +10,7 @@ struct lineptr
 };
 
 extern unsigned char *mbvalidate(unsigned char *pwcs, int encoding);
-extern int     pg_wcswidth(const unsigned char *pwcs, size_t len, int encoding);
+extern int     pg_wcswidth(const char *pwcs, size_t len, int encoding);
 extern void pg_wcsformat(const unsigned char *pwcs, size_t len, int encoding, struct lineptr * lines, int count);
 extern void pg_wcssize(const unsigned char *pwcs, size_t len, int encoding,
                   int *width, int *height, int *format_size);