Make the printing code somewhat more independent by not relying on
authorPeter Eisentraut
Tue, 18 Mar 2003 22:15:44 +0000 (22:15 +0000)
committerPeter Eisentraut
Tue, 18 Mar 2003 22:15:44 +0000 (22:15 +0000)
functions and global variables from the rest of psql.  Also clean up some
data type mismatches created by the last pager patch.

src/bin/psql/command.c
src/bin/psql/common.c
src/bin/psql/common.h
src/bin/psql/help.c
src/bin/psql/help.h
src/bin/psql/mbprint.c
src/bin/psql/mbprint.h
src/bin/psql/print.c
src/bin/psql/print.h
src/bin/psql/startup.c

index feb6ba32a9092ee3e24d2ce34c772d5551f196b3..66a8553e2120b323b1a2aaf77437bdb2abe6d255 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000-2002 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.91 2003/03/10 15:46:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.92 2003/03/18 22:15:43 petere Exp $
  */
 #include "postgres_fe.h"
 #include "command.h"
@@ -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));
index 0caaf1ef64057f1d49753adbf2c0197d04415b35..5d7180f9939a798d7f59f52cc72cf97e7adfa468 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.56 2003/03/10 22:28:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.57 2003/03/18 22:15:44 petere Exp $
  */
 #include "postgres_fe.h"
 #include "common.h"
 #include          /* for _ftime() */
 #endif
 
-#ifndef WIN32
-#include          /* for ioctl() */
-#endif
-
-#ifdef HAVE_TERMIOS_H
-#include 
-#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;
-}
index 3b0c7d8b5637f78c98267719ddf3f4e3fda85216..fdfcdc05ebcff6e0bee766856f2819d1b410cb61 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.21 2002/10/29 19:35:33 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.22 2003/03/18 22:15:44 petere Exp $
  */
 #ifndef COMMON_H
 #define 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);
 
index d1a30e40ae7e38fb52a536caa0fe1e3d0e56397c..1a55640afae50300ce75af6e8ae08782372b9b72 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.70 2003/03/10 15:46:03 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.71 2003/03/18 22:15:44 petere Exp $
  */
 #include "postgres_fe.h"
 #include "common.h"
@@ -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) : "")
 
index 7b3078dd85d40c8c7f61aeea60c9c3fc6fce61f5..8b247d0fedee750788f80091383a4ae1ffde497b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.11 2002/11/08 19:12:21 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.12 2003/03/18 22:15:44 petere Exp $
  */
 #ifndef HELP_H
 #define 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);
 
index c91b71c9c5beafe846ac9299b83163491b6b0084..692f60bf775e435fc099fcb225dd7fbdec644549 100644 (file)
@@ -3,14 +3,13 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/mbprint.c,v 1.5 2002/10/03 17:09:42 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/mbprint.c,v 1.6 2003/03/18 22:15:44 petere Exp $
  */
 
 #include "postgres_fe.h"
 #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
    {
index 826b71c84a456e3cae20fca9b717345b3b4ba530..7624a34793beadefa88db94b5fc0c62fea4f2a4d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mbprint.h,v 1.5 2002/08/27 20:16:48 petere Exp $ */
+/* $Id: mbprint.h,v 1.6 2003/03/18 22:15:44 petere Exp $ */
 #ifndef MBPRINT_H
 #define 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 */
index 4c76d06f8f9f39db5a6356562cb145d1cc030f70..7ac365647d5c3bab55f0f39b71faf4a008963e7e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.35 2002/11/01 15:12:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.36 2003/03/18 22:15:44 petere Exp $
  */
 #include "postgres_fe.h"
 #include "common.h"
 
 #include 
 #include 
+#include 
+
+#ifndef WIN32
+#include          /* 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 */
index f97bf9ead5244e9347e7e97ca1edbab7d61ad9e9..e0ce3401d383b00bcb450ec2fb0533ab13e95069 100644 (file)
@@ -3,13 +3,17 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.15 2002/11/08 19:12:21 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.16 2003/03/18 22:15:44 petere Exp $
  */
 #ifndef PRINT_H
 #define PRINT_H
 
 #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  */
+   int         encoding;       /* character encoding */
 } printTableOpt;
 
 
index 28bbf3cc5e13840d82c802e1afb2ed478fae47dc..39c22dfc69aa49ca8da96d12dd90f0beefb2cb0a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.70 2003/01/06 18:53:25 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.71 2003/03/18 22:15:44 petere Exp $
  */
 #include "postgres_fe.h"
 
@@ -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
     */