*
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/mbprint.c,v 1.29 2008/01/01 19:45:56 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/mbprint.c,v 1.29.2.1 2008/05/29 19:34:43 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
/*
* pg_wcssize takes the given string in the given encoding and returns three
* values:
- * result_width: Width in display character of longest line in string
- * result_hieght: Number of lines in display output
- * result_format_size: Number of bytes required to store formatted representation of string
+ * result_width: Width in display characters of the longest line in 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,
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;
}
if (linewidth > width)
width = linewidth;
- format_size += 1;
+ format_size += 1; /* For NUL char */
/* Set results */
if (result_width)
*result_height = height;
if (result_format_size)
*result_format_size = format_size;
-
- return width;
}
+/*
+ * 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,
struct lineptr * lines, int count)
linewidth = 0;
lines++;
count--;
- if (count == 0)
+ if (count <= 0)
exit(1); /* Screwup */
lines->ptr = ptr;
linewidth += 2;
ptr += 2;
}
+ else if (*pwcs == '\t') /* Tab */
+ {
+ do
+ {
+ *ptr++ = ' ';
+ linewidth++;
+ } while (linewidth % 8 != 0);
+ }
else if (w < 0) /* Other control char */
{
sprintf((char *) ptr, "\\x%02X", *pwcs);
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;
}
-/* $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.11.4.1 2008/05/29 19:34:43 tgl Exp $ */
#ifndef MBPRINT_H
#define MBPRINT_H
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 */
SELECT * FROM road WHERE thepath = $1;
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
- name | statement | parameter_types
-------+-----------------------------------------------------------------+--------------------------------------------------------
- q2 | PREPARE q2(text) AS | {text}
- : \x09SELECT datname, datistemplate, datallowconn
- : \x09FROM pg_database WHERE datname = $1;
- q3 | PREPARE q3(text, int, float, boolean, oid, smallint) AS | {text,integer,"double precision",boolean,oid,smallint}
- : \x09SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR
- : \x09ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int)
- : \x09ORDER BY unique1;
- q5 | PREPARE q5(int, text) AS | {integer,text}
- : \x09SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
- : \x09ORDER BY unique1;
- q6 | PREPARE q6 AS | {integer,name}
- : SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
- q7 | PREPARE q7(unknown) AS | {path}
- : SELECT * FROM road WHERE thepath = $1;
+ name | statement | parameter_types
+------+---------------------------------------------------------------------+--------------------------------------------------------
+ q2 | PREPARE q2(text) AS | {text}
+ : SELECT datname, datistemplate, datallowconn
+ : FROM pg_database WHERE datname = $1;
+ q3 | PREPARE q3(text, int, float, boolean, oid, smallint) AS | {text,integer,"double precision",boolean,oid,smallint}
+ : SELECT * FROM tenk1 WHERE string4 = $1 AND (four = $2 OR
+ : ten = $3::bigint OR true = $4 OR oid = $5 OR odd = $6::int)
+ : ORDER BY unique1;
+ q5 | PREPARE q5(int, text) AS | {integer,text}
+ : SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
+ : ORDER BY unique1;
+ q6 | PREPARE q6 AS | {integer,name}
+ : SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
+ q7 | PREPARE q7(unknown) AS | {path}
+ : SELECT * FROM road WHERE thepath = $1;
(5 rows)
-- test DEALLOCATE ALL;