mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
Fix psql \h output for case of no parameters (ie, list all the known commands)
to format properly for the actually needed column width, instead of having a hard-wired assumption about the longest command name length. Also make it respond to the current screen width. In passing, const-ify the constant table.
This commit is contained in:
parent
000666bbfe
commit
f7108ce06b
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
# Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
||||||
#
|
#
|
||||||
# $PostgreSQL: pgsql/src/bin/psql/create_help.pl,v 1.16 2008/01/01 19:45:55 momjian Exp $
|
# $PostgreSQL: pgsql/src/bin/psql/create_help.pl,v 1.17 2008/01/20 21:13:55 tgl Exp $
|
||||||
#################################################################
|
#################################################################
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -51,20 +51,21 @@ print OUT
|
|||||||
#ifndef $define
|
#ifndef $define
|
||||||
#define $define
|
#define $define
|
||||||
|
|
||||||
#define N_(x) (x) /* gettext noop */
|
#define N_(x) (x) /* gettext noop */
|
||||||
|
|
||||||
struct _helpStruct
|
struct _helpStruct
|
||||||
{
|
{
|
||||||
char *cmd; /* the command name */
|
const char *cmd; /* the command name */
|
||||||
char *help; /* the help associated with it */
|
const char *help; /* the help associated with it */
|
||||||
char *syntax; /* the syntax associated with it */
|
const char *syntax; /* the syntax associated with it */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static struct _helpStruct QL_HELP[] = {
|
static const struct _helpStruct QL_HELP[] = {
|
||||||
";
|
";
|
||||||
|
|
||||||
$count = 0;
|
$count = 0;
|
||||||
|
$maxlen = 0;
|
||||||
|
|
||||||
foreach $file (sort readdir DIR) {
|
foreach $file (sort readdir DIR) {
|
||||||
local ($cmdname, $cmddesc, $cmdsynopsis);
|
local ($cmdname, $cmddesc, $cmdsynopsis);
|
||||||
@ -113,7 +114,9 @@ foreach $file (sort readdir DIR) {
|
|||||||
$cmdsynopsis =~ s/\"/\\"/g;
|
$cmdsynopsis =~ s/\"/\\"/g;
|
||||||
|
|
||||||
print OUT " { \"$cmdname\",\n N_(\"$cmddesc\"),\n N_(\"$cmdsynopsis\") },\n\n";
|
print OUT " { \"$cmdname\",\n N_(\"$cmddesc\"),\n N_(\"$cmdsynopsis\") },\n\n";
|
||||||
$count++;
|
|
||||||
|
$count++;
|
||||||
|
$maxlen = ($maxlen >= length $cmdname) ? $maxlen : length $cmdname;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
print STDERR "$0: parsing file '$file' failed (N='$cmdname' D='$cmddesc')\n";
|
print STDERR "$0: parsing file '$file' failed (N='$cmdname' D='$cmddesc')\n";
|
||||||
@ -125,7 +128,8 @@ print OUT "
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define QL_HELP_COUNT $count
|
#define QL_HELP_COUNT $count /* number of help items */
|
||||||
|
#define QL_MAX_CMD_LEN $maxlen /* largest strlen(cmd) */
|
||||||
|
|
||||||
|
|
||||||
#endif /* $define */
|
#endif /* $define */
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.121 2008/01/01 19:45:56 momjian Exp $
|
* $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.122 2008/01/20 21:13:55 tgl Exp $
|
||||||
*/
|
*/
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
|
|
||||||
@ -19,6 +19,14 @@
|
|||||||
#include <win32.h>
|
#include <win32.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
#include <sys/ioctl.h> /* for ioctl() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_TERMIOS_H
|
||||||
|
#include <termios.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "pqsignal.h"
|
#include "pqsignal.h"
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
@ -147,15 +155,6 @@ usage(void)
|
|||||||
*
|
*
|
||||||
* print out help for the backslash commands
|
* print out help for the backslash commands
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TIOCGWINSZ
|
|
||||||
struct winsize
|
|
||||||
{
|
|
||||||
int ws_row;
|
|
||||||
int ws_col;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
slashUsage(unsigned short int pager)
|
slashUsage(unsigned short int pager)
|
||||||
{
|
{
|
||||||
@ -280,24 +279,46 @@ helpSQL(const char *topic, unsigned short int pager)
|
|||||||
|
|
||||||
if (!topic || strlen(topic) == 0)
|
if (!topic || strlen(topic) == 0)
|
||||||
{
|
{
|
||||||
int i;
|
/* Print all the available command names */
|
||||||
int items_per_column = (QL_HELP_COUNT + 2) / 3;
|
int screen_width;
|
||||||
|
int ncolumns;
|
||||||
|
int nrows;
|
||||||
FILE *output;
|
FILE *output;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
output = PageOutput(items_per_column + 1, pager);
|
#ifdef TIOCGWINSZ
|
||||||
|
struct winsize screen_size;
|
||||||
|
|
||||||
|
if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1)
|
||||||
|
screen_width = 80; /* ioctl failed, assume 80 */
|
||||||
|
else
|
||||||
|
screen_width = screen_size.ws_col;
|
||||||
|
#else
|
||||||
|
screen_width = 80; /* default assumption */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ncolumns = (screen_width - 3) / (QL_MAX_CMD_LEN + 1);
|
||||||
|
ncolumns = Max(ncolumns, 1);
|
||||||
|
nrows = (QL_HELP_COUNT + (ncolumns - 1)) / ncolumns;
|
||||||
|
|
||||||
|
output = PageOutput(nrows + 1, pager);
|
||||||
|
|
||||||
fputs(_("Available help:\n"), output);
|
fputs(_("Available help:\n"), output);
|
||||||
|
|
||||||
for (i = 0; i < items_per_column; i++)
|
for (i = 0; i < nrows; i++)
|
||||||
{
|
{
|
||||||
fprintf(output, " %-26s%-26s",
|
fprintf(output, " ");
|
||||||
VALUE_OR_NULL(QL_HELP[i].cmd),
|
for (j = 0; j < ncolumns-1; j++)
|
||||||
VALUE_OR_NULL(QL_HELP[i + items_per_column].cmd));
|
fprintf(output, "%-*s",
|
||||||
if (i + 2 * items_per_column < QL_HELP_COUNT)
|
QL_MAX_CMD_LEN + 1,
|
||||||
fprintf(output, "%-26s",
|
VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
|
||||||
VALUE_OR_NULL(QL_HELP[i + 2 * items_per_column].cmd));
|
if (i + j * nrows < QL_HELP_COUNT)
|
||||||
|
fprintf(output, "%s",
|
||||||
|
VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
|
||||||
fputc('\n', output);
|
fputc('\n', output);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only close if we used the pager */
|
/* Only close if we used the pager */
|
||||||
if (output != stdout)
|
if (output != stdout)
|
||||||
{
|
{
|
||||||
@ -317,7 +338,7 @@ helpSQL(const char *topic, unsigned short int pager)
|
|||||||
size_t len,
|
size_t len,
|
||||||
wordlen;
|
wordlen;
|
||||||
int nl_count = 0;
|
int nl_count = 0;
|
||||||
char *ch;
|
const char *ch;
|
||||||
|
|
||||||
/* User gets two chances: exact match, then the first word */
|
/* User gets two chances: exact match, then the first word */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user