summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2003-03-18 22:15:44 +0000
committerPeter Eisentraut2003-03-18 22:15:44 +0000
commit02d13330f32b86b9914d5e596720a30dd368fde3 (patch)
treec58f8f688e1f620d4f6a9f23559701025b6b5dd4
parente9a146e02a8dad7f00953c92a7682a3d4b145407 (diff)
Make the printing code somewhat more independent by not relying on
functions and global variables from the rest of psql. Also clean up some data type mismatches created by the last pager patch.
-rw-r--r--src/bin/psql/command.c2
-rw-r--r--src/bin/psql/common.c51
-rw-r--r--src/bin/psql/common.h2
-rw-r--r--src/bin/psql/help.c2
-rw-r--r--src/bin/psql/help.h2
-rw-r--r--src/bin/psql/mbprint.c9
-rw-r--r--src/bin/psql/mbprint.h4
-rw-r--r--src/bin/psql/print.c78
-rw-r--r--src/bin/psql/print.h5
-rw-r--r--src/bin/psql/startup.c2
10 files changed, 78 insertions, 79 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index cfe7b1a988..895c5d090d 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -471,6 +471,7 @@ exec_command(const char *cmd,
{
/* save encoding info into psql internal data */
pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = PQclientEncoding(pset.db);
SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
}
free(encoding);
@@ -1445,6 +1446,7 @@ do_connect(const char *new_dbname, const char *new_user)
PQsetNoticeProcessor(pset.db, NoticeProcessor, NULL);
pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = PQclientEncoding(pset.db);
/* Update variables */
SetVariable(pset.vars, "DBNAME", PQdb(pset.db));
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 1d12623f9d..b96f690b22 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -24,14 +24,6 @@
#include <sys/timeb.h> /* for _ftime() */
#endif
-#ifndef WIN32
-#include <sys/ioctl.h> /* for ioctl() */
-#endif
-
-#ifdef HAVE_TERMIOS_H
-#include <termios.h>
-#endif
-
#include "libpq-fe.h"
#include "pqsignal.h"
@@ -522,46 +514,3 @@ SendQuery(const char *query)
return success;
}
-
-
-/*
- * PageOutput
- *
- * Tests if pager is needed and returns appropriate FILE pointer.
- */
-FILE *
-PageOutput(int lines, bool pager)
-{
- /* check whether we need / can / are supposed to use pager */
- if (pager
-#ifndef WIN32
- &&
- isatty(fileno(stdin)) &&
- isatty(fileno(stdout))
-#endif
- )
- {
- const char *pagerprog;
-
-#ifdef TIOCGWINSZ
- int result;
- struct winsize screen_size;
-
- result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
- if (result == -1 || lines > screen_size.ws_row || pager > 1)
- {
-#endif
- pagerprog = getenv("PAGER");
- if (!pagerprog)
- pagerprog = DEFAULT_PAGER;
-#ifndef WIN32
- pqsignal(SIGPIPE, SIG_IGN);
-#endif
- return popen(pagerprog, "w");
-#ifdef TIOCGWINSZ
- }
-#endif
- }
-
- return stdout;
-}
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
index d18df0e15b..3a0b0bb44a 100644
--- a/src/bin/psql/common.h
+++ b/src/bin/psql/common.h
@@ -37,8 +37,6 @@ extern PGresult *PSQLexec(const char *query, bool ignore_command_ok);
extern bool SendQuery(const char *query);
-extern FILE *PageOutput(int lines, bool pager);
-
/* sprompt.h */
extern char *simple_prompt(const char *prompt, int maxlen, bool echo);
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index afe4ee72ad..6f46004c74 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -262,7 +262,7 @@ slashUsage(unsigned short int pager)
*
*/
void
-helpSQL(const char *topic, bool pager)
+helpSQL(const char *topic, unsigned short int pager)
{
#define VALUE_OR_NULL(a) ((a) ? (a) : "")
diff --git a/src/bin/psql/help.h b/src/bin/psql/help.h
index 39bd0ebe4f..14c162217b 100644
--- a/src/bin/psql/help.h
+++ b/src/bin/psql/help.h
@@ -12,7 +12,7 @@ void usage(void);
void slashUsage(unsigned short int pager);
-void helpSQL(const char *topic, bool pager);
+void helpSQL(const char *topic, unsigned short int pager);
void print_copyright(void);
diff --git a/src/bin/psql/mbprint.c b/src/bin/psql/mbprint.c
index 0367d71aa1..3591908c6d 100644
--- a/src/bin/psql/mbprint.c
+++ b/src/bin/psql/mbprint.c
@@ -10,7 +10,6 @@
#include "mbprint.h"
#include "mb/pg_wchar.h"
-#include "settings.h"
/*
* This is an implementation of wcwidth() and wcswidth() as defined in
@@ -310,9 +309,9 @@ mb_utf_validate(unsigned char *pwcs)
*/
int
-pg_wcswidth(unsigned char *pwcs, size_t len)
+pg_wcswidth(unsigned char *pwcs, size_t len, int encoding)
{
- if (pset.encoding == PG_UTF8)
+ if (encoding == PG_UTF8)
return mb_utf_wcswidth(pwcs, len);
else
{
@@ -325,9 +324,9 @@ pg_wcswidth(unsigned char *pwcs, size_t len)
}
unsigned char *
-mbvalidate(unsigned char *pwcs)
+mbvalidate(unsigned char *pwcs, int encoding)
{
- if (pset.encoding == PG_UTF8)
+ if (encoding == PG_UTF8)
return mb_utf_validate(pwcs);
else
{
diff --git a/src/bin/psql/mbprint.h b/src/bin/psql/mbprint.h
index 4e96373d49..6ca16cb927 100644
--- a/src/bin/psql/mbprint.h
+++ b/src/bin/psql/mbprint.h
@@ -6,8 +6,8 @@
pg_wchar utf2ucs(const unsigned char *c);
-unsigned char *mbvalidate(unsigned char *pwcs);
+unsigned char *mbvalidate(unsigned char *pwcs, int encoding);
-int pg_wcswidth(unsigned char *pwcs, size_t len);
+int pg_wcswidth(unsigned char *pwcs, size_t len, int encoding);
#endif /* MBPRINT_H */
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 62ccf9995f..0d27a0f91c 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -11,12 +11,15 @@
#include <math.h>
#include <signal.h>
+#include <unistd.h>
+
+#ifndef WIN32
+#include <sys/ioctl.h> /* for ioctl() */
+#endif
#include "pqsignal.h"
#include "libpq-fe.h"
-#include "settings.h"
-
#include "mbprint.h"
/*************************/
@@ -195,7 +198,7 @@ static void
print_aligned_text(const char *title, const char *const * headers,
const char *const * cells, const char *const * footers,
const char *opt_align, bool opt_barebones,
- unsigned short int opt_border,
+ unsigned short int opt_border, int encoding,
FILE *fout)
{
unsigned int col_count = 0;
@@ -253,7 +256,7 @@ print_aligned_text(const char *title, const char *const * headers,
/* calc column widths */
for (i = 0; i < col_count; i++)
{
- tmp = pg_wcswidth((unsigned char *) headers[i], strlen(headers[i]));
+ tmp = pg_wcswidth((unsigned char *) headers[i], strlen(headers[i]), encoding);
if (tmp > widths[i])
widths[i] = tmp;
head_w[i] = tmp;
@@ -261,7 +264,7 @@ print_aligned_text(const char *title, const char *const * headers,
for (i = 0, ptr = cells; *ptr; ptr++, i++)
{
- tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr));
+ tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding);
if (tmp > widths[i % col_count])
widths[i % col_count] = tmp;
cell_w[i] = tmp;
@@ -282,7 +285,7 @@ print_aligned_text(const char *title, const char *const * headers,
{
int tlen;
- tlen = pg_wcswidth((unsigned char *) title, strlen(title));
+ tlen = pg_wcswidth((unsigned char *) title, strlen(title), encoding);
if (tlen >= (int) total_w)
fprintf(fout, "%s\n", title);
else
@@ -392,9 +395,9 @@ print_aligned_text(const char *title, const char *const * headers,
static void
print_aligned_vertical(const char *title, const char *const * headers,
- const char *const * cells, const char *const * footers,
+ const char *const * cells, const char *const * footers,
bool opt_barebones, unsigned short int opt_border,
- FILE *fout)
+ int encoding, FILE *fout)
{
unsigned int col_count = 0;
unsigned int record = 1;
@@ -425,7 +428,7 @@ print_aligned_vertical(const char *title, const char *const * headers,
}
for (i = 0; i < col_count; i++)
{
- if ((tmp = pg_wcswidth((unsigned char *) headers[i], strlen(headers[i]))) > hwidth)
+ if ((tmp = pg_wcswidth((unsigned char *) headers[i], strlen(headers[i]), encoding)) > hwidth)
hwidth = tmp;
head_w[i] = tmp;
}
@@ -447,7 +450,7 @@ print_aligned_vertical(const char *title, const char *const * headers,
/* find longest data cell */
for (i = 0, ptr = cells; *ptr; ptr++, i++)
{
- if ((tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr))) > dwidth)
+ if ((tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding)) > dwidth)
dwidth = tmp;
cell_w[i] = tmp;
}
@@ -953,14 +956,55 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
-
-
-
/********************************/
/* Public functions */
/********************************/
+/*
+ * PageOutput
+ *
+ * Tests if pager is needed and returns appropriate FILE pointer.
+ */
+FILE *
+PageOutput(int lines, unsigned short int pager)
+{
+ /* check whether we need / can / are supposed to use pager */
+ if (pager
+#ifndef WIN32
+ &&
+ isatty(fileno(stdin)) &&
+ isatty(fileno(stdout))
+#endif
+ )
+ {
+ const char *pagerprog;
+
+#ifdef TIOCGWINSZ
+ int result;
+ struct winsize screen_size;
+
+ result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
+ if (result == -1 || lines > screen_size.ws_row || pager > 1)
+ {
+#endif
+ pagerprog = getenv("PAGER");
+ if (!pagerprog)
+ pagerprog = DEFAULT_PAGER;
+#ifndef WIN32
+ pqsignal(SIGPIPE, SIG_IGN);
+#endif
+ return popen(pagerprog, "w");
+#ifdef TIOCGWINSZ
+ }
+#endif
+ }
+
+ return stdout;
+}
+
+
+
void
printTable(const char *title,
const char *const * headers,
@@ -1023,9 +1067,9 @@ printTable(const char *title,
break;
case PRINT_ALIGNED:
if (opt->expanded)
- print_aligned_vertical(title, headers, cells, footers, opt->tuples_only, border, output);
+ print_aligned_vertical(title, headers, cells, footers, opt->tuples_only, border, opt->encoding, output);
else
- print_aligned_text(title, headers, cells, footers, align, opt->tuples_only, border, output);
+ print_aligned_text(title, headers, cells, footers, align, opt->tuples_only, border, opt->encoding, output);
break;
case PRINT_HTML:
if (opt->expanded)
@@ -1077,7 +1121,7 @@ printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout)
}
for (i = 0; i < nfields; i++)
- headers[i] = mbvalidate(PQfname(result, i));
+ headers[i] = mbvalidate(PQfname(result, i), opt->topt.encoding);
/* set cells */
@@ -1093,7 +1137,7 @@ printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout)
if (PQgetisnull(result, i / nfields, i % nfields))
cells[i] = opt->nullPrint ? opt->nullPrint : "";
else
- cells[i] = mbvalidate(PQgetvalue(result, i / nfields, i % nfields));
+ cells[i] = mbvalidate(PQgetvalue(result, i / nfields, i % nfields), opt->topt.encoding);
}
/* set footers */
diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h
index 09033c7bbb..cd497be341 100644
--- a/src/bin/psql/print.h
+++ b/src/bin/psql/print.h
@@ -10,6 +10,10 @@
#include "libpq-fe.h"
+
+extern FILE *PageOutput(int lines, unsigned short int pager);
+
+
enum printFormat
{
PRINT_NOTHING = 0, /* to make sure someone initializes this */
@@ -36,6 +40,7 @@ typedef struct _printTableOpt
char *recordSep; /* record separator for unaligned text
* mode */
char *tableAttr; /* attributes for HTML <table ...> */
+ int encoding; /* character encoding */
} printTableOpt;
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index bd5ebd3fcc..01faa88090 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -231,6 +231,8 @@ main(int argc, char *argv[])
SetVariable(pset.vars, "PORT", PQport(pset.db));
SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
+ pset.popt.topt.encoding = pset.encoding;
+
/*
* Now find something to do
*/