Troff -ms output for psql

Started by Roger Leighalmost 22 years ago5 messagespatches
Jump to latest
#1Roger Leigh
rleigh@whinlatter.ukfsn.org

Hello,

I've created a patch which adds support for troff "-ms" output to
psql. i.e. "\pset format troff-ms". The patch also corrects some
problems with the "latex" format, notably defining an extra column in
the output table, and correcting some alignment issues; it also
changes the output to match the border setting as documented in the
manual page and as shown with the "aligned" format.

The troff-ms output is mostly identical to the latex output allowing
for the differences between the two typesetters.

The output should be saved in a file and piped as follows:

cat file | tbl | troff -T ps -ms > file.ps
or
tbl file | troff -T ps -ms > file.ps

Because it contains tabs, you'll need to redirect psql output or use
"script", rather than pasting from a terminal window, due to the tabs
which can be replaced with spaces.

I've attached the patch (against the current mainline), and example
output of each for each of border=[123] and expanded mode on and off
(both source and printable copy).

Regards,
Roger

PS. I'm not subscribed, so I would appreciate a CC on any replies.
Thanks!

--
Roger Leigh

Printing on GNU/Linux? http://gimp-print.sourceforge.net/
GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.

Attachments:

pgsql-psql-troff-ms.difftext/x-patchDownload+253-30
mstest.ms.bz2application/octet-streamDownload
mstest.ps.bz2application/octet-streamDownload
latextest.tex.bz2application/octet-streamDownload
latextest.pdf.bz2application/octet-streamDownload
#2Bruce Momjian
bruce@momjian.us
In reply to: Roger Leigh (#1)
Re: Troff -ms output for psql

This has been saved for the 7.6 release:

http:/momjian.postgresql.org/cgi-bin/pgpatches2

---------------------------------------------------------------------------

Roger Leigh wrote:

Hello,

I've created a patch which adds support for troff "-ms" output to
psql. i.e. "\pset format troff-ms". The patch also corrects some
problems with the "latex" format, notably defining an extra column in
the output table, and correcting some alignment issues; it also
changes the output to match the border setting as documented in the
manual page and as shown with the "aligned" format.

The troff-ms output is mostly identical to the latex output allowing
for the differences between the two typesetters.

The output should be saved in a file and piped as follows:

cat file | tbl | troff -T ps -ms > file.ps
or
tbl file | troff -T ps -ms > file.ps

Because it contains tabs, you'll need to redirect psql output or use
"script", rather than pasting from a terminal window, due to the tabs
which can be replaced with spaces.

I've attached the patch (against the current mainline), and example
output of each for each of border=[123] and expanded mode on and off
(both source and printable copy).

Regards,
Roger

PS. I'm not subscribed, so I would appreciate a CC on any replies.
Thanks!

--
Roger Leigh

Printing on GNU/Linux? http://gimp-print.sourceforge.net/
GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.

Content-Description: patch to add troff output to psql

[ text/x-patch is unsupported, treating like TEXT/PLAIN ]

Index: doc/src/sgml/ref/psql-ref.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/psql-ref.sgml,v
retrieving revision 1.119
diff -u -r1.119 psql-ref.sgml
--- doc/src/sgml/ref/psql-ref.sgml	15 Jul 2004 03:56:04 -0000	1.119
+++ doc/src/sgml/ref/psql-ref.sgml	1 Aug 2004 17:36:46 -0000
@@ -1372,9 +1372,10 @@
<listitem>
<para>
Sets the output format to one of <literal>unaligned</literal>,
-          <literal>aligned</literal>, <literal>html</literal>, or
-          <literal>latex</literal>. Unique abbreviations are allowed.
-          (That would mean one letter is enough.)
+          <literal>aligned</literal>, <literal>html</literal>,
+          <literal>latex</literal>, or <literal>troff-ms</literal>.
+	  Unique abbreviations are allowed.  (That would mean one letter
+	  is enough.)
</para>
<para>
Index: src/bin/psql/command.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/command.c,v
retrieving revision 1.122
diff -u -r1.122 command.c
--- src/bin/psql/command.c	15 Jul 2004 03:56:06 -0000	1.122
+++ src/bin/psql/command.c	1 Aug 2004 17:36:53 -0000
@@ -1307,6 +1307,9 @@
case PRINT_LATEX:
return "latex";
break;
+		case PRINT_TROFF_MS:
+			return "troff-ms";
+			break;
}
return "unknown";
}
@@ -1335,9 +1338,11 @@
popt->topt.format = PRINT_HTML;
else if (pg_strncasecmp("latex", value, vallen) == 0)
popt->topt.format = PRINT_LATEX;
+		else if (pg_strncasecmp("troff-ms", value, vallen) == 0)
+			popt->topt.format = PRINT_TROFF_MS;
else
{
-			psql_error("\\pset: allowed formats are unaligned, aligned, html, latex\n");
+			psql_error("\\pset: allowed formats are unaligned, aligned, html, latex, troff-ms\n");
return false;
}
Index: src/bin/psql/print.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.c,v
retrieving revision 1.48
diff -u -r1.48 print.c
--- src/bin/psql/print.c	23 May 2004 22:20:10 -0000	1.48
+++ src/bin/psql/print.c	1 Aug 2004 17:36:56 -0000
@@ -769,7 +769,7 @@
/*************************/
-/* LaTeX				 */
+/* LaTeX		 */
/*************************/

@@ -790,6 +790,9 @@
case '$':
fputs("\\$", fout);
break;
+ case '_':
+ fputs("\\_", fout);
+ break;
case '{':
fputs("\\{", fout);
break;
@@ -817,7 +820,6 @@
{
unsigned int col_count = 0;
unsigned int i;
- const char *cp;
const char *const * ptr;

@@ -829,42 +831,39 @@
fputs("\n\\end{center}\n\n", fout);
}

+	/* count columns */
+	for (ptr = headers; *ptr; ptr++)
+		col_count++;
+
/* begin environment and set alignments and borders */
fputs("\\begin{tabular}{", fout);
-	if (opt_border == 0)
-		fputs(opt_align, fout);
-	else if (opt_border == 1)
-	{
-		for (cp = opt_align; *cp; cp++)
-		{
-			if (cp != opt_align)
-				fputc('|', fout);
-			fputc(*cp, fout);
-		}
-	}
-	else if (opt_border == 2)
+
+	if (opt_border == 2)
+	  fputs("| ", fout);
+        for (i = 0; i < col_count; i++)
{
-		for (cp = opt_align; *cp; cp++)
-		{
-			fputc('|', fout);
-			fputc(*cp, fout);
-		}
-		fputc('|', fout);
+	  fputc(*(opt_align + i), fout);
+	  if (opt_border != 0 && i < col_count - 1)
+	    fputs (" | ", fout);
}
+	if (opt_border == 2)
+	  fputs(" |", fout);
+
fputs("}\n", fout);

if (!opt_barebones && opt_border == 2)
fputs("\\hline\n", fout);

/* print headers and count columns */
-	for (i = 0, ptr = headers; *ptr; i++, ptr++)
+	for (i = 0, ptr = headers; i < col_count; i++, ptr++)
{
-		col_count++;
if (!opt_barebones)
{
if (i != 0)
fputs(" & ", fout);
+                        fputs("\\textit{", fout);
latex_escaped_print(*ptr, fout);
+                        fputc('}', fout);
}
}

@@ -888,7 +887,7 @@
if (opt_border == 2)
fputs("\\hline\n", fout);

-	fputs("\\end{tabular}\n\n", fout);
+	fputs("\\end{tabular}\n\n\\noindent ", fout);
/* print footers */
@@ -951,8 +950,12 @@
if (!opt_barebones)
{
if (opt_border == 2)
+				{
fputs("\\hline\n", fout);
-				fprintf(fout, "\\multicolumn{2}{c}{Record %d} \\\\\n", record++);
+					fprintf(fout, "\\multicolumn{2}{|c|}{\\textit{Record %d}} \\\\\n", record++);
+				}
+				else
+					fprintf(fout, "\\multicolumn{2}{c}{\\textit{Record %d}} \\\\\n", record++);
}
if (opt_border >= 1)
fputs("\\hline\n", fout);
@@ -967,7 +970,7 @@
if (opt_border == 2)
fputs("\\hline\n", fout);
-	fputs("\\end{tabular}\n\n", fout);
+	fputs("\\end{tabular}\n\n\\noindent ", fout);

/* print footers */
@@ -984,6 +987,213 @@

+/*************************/
+/* Troff -ms		 */
+/*************************/
+
+
+static void
+troff_ms_escaped_print(const char *in, FILE *fout)
+{
+	const char *p;
+
+	for (p = in; *p; p++)
+		switch (*p)
+		{
+			case '\\':
+				fputs("\(rs", fout);
+				break;
+			default:
+				fputc(*p, fout);
+		}
+}
+
+
+
+static void
+print_troff_ms_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,
+				 FILE *fout)
+{
+	unsigned int col_count = 0;
+	unsigned int i;
+	const char *const * ptr;
+
+
+	/* print title */
+	if (!opt_barebones && title)
+	{
+		fputs(".LP\n.DS C\n", fout);
+		troff_ms_escaped_print(title, fout);
+		fputs("\n.DE\n", fout);
+	}
+
+	/* count columns */
+	for (ptr = headers; *ptr; ptr++)
+		col_count++;
+
+	/* begin environment and set alignments and borders */
+	fputs(".LP\n.TS\n", fout);
+	if (opt_border == 2)
+		fputs("center box;\n", fout);
+	else
+		fputs("center;\n", fout);
+
+	for (i = 0; i < col_count; i++)
+	{
+		fputc(*(opt_align + i), fout);
+		if (opt_border > 0 && i < col_count - 1)
+			fputs(" | ", fout);
+	}
+	fputs(".\n", fout);
+
+	/* print headers and count columns */
+	for (i = 0, ptr = headers; i < col_count; i++, ptr++)
+	{
+		if (!opt_barebones)
+		{
+			if (i != 0)
+				fputc('\t', fout);
+			fputs("\\fI", fout);
+			troff_ms_escaped_print(*ptr, fout);
+			fputs("\\fP", fout);
+		}
+	}
+
+	if (!opt_barebones)
+	{
+		fputs("\n_\n", fout);
+	}
+
+	/* print cells */
+	for (i = 0, ptr = cells; *ptr; i++, ptr++)
+	{
+		troff_ms_escaped_print(*ptr, fout);
+
+		if ((i + 1) % col_count == 0)
+			fputc('\n', fout);
+		else
+			fputc('\t', fout);
+	}
+
+	fputs(".TE\n.DS L\n", fout);
+
+
+	/* print footers */
+
+	if (footers && !opt_barebones)
+		for (ptr = footers; *ptr; ptr++)
+		{
+			troff_ms_escaped_print(*ptr, fout);
+			fputc('\n', fout);
+		}
+
+	fputs(".DE\n", fout);
+}
+
+
+
+static void
+print_troff_ms_vertical(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,
+					 FILE *fout)
+{
+	unsigned int col_count = 0;
+	unsigned int i;
+	const char *const * ptr;
+	unsigned int record = 1;
+        unsigned short current_format = 0; /* 0=none, 1=header, 2=body */
+
+	(void) opt_align;			/* currently unused parameter */
+
+	/* print title */
+	if (!opt_barebones && title)
+	{
+		fputs(".LP\n.DS C\n", fout);
+		troff_ms_escaped_print(title, fout);
+		fputs("\n.DE\n", fout);
+	}
+
+	/* begin environment and set alignments and borders */
+	fputs(".LP\n.TS\n", fout);
+	if (opt_border == 2)
+		fputs("center box;\n", fout);
+	else
+		fputs("center;\n", fout);
+
+	/* basic format */
+        if (opt_barebones)
+ 		fputs("c l;\n", fout);
+
+
+	/* count columns */
+	for (ptr = headers; *ptr; ptr++)
+		col_count++;
+
+
+	/* print records */
+	for (i = 0, ptr = cells; *ptr; i++, ptr++)
+	{
+		/* new record */
+		if (i % col_count == 0)
+		{
+			if (!opt_barebones)
+			{
+
+				if (current_format != 1)
+				{
+					if (opt_border == 2 && i > 0)
+						fputs("_\n", fout);
+					if (current_format != 0)
+						fputs(".T&\n", fout);
+					fputs("c s.\n", fout);
+					current_format = 1;
+				}
+				fprintf(fout, "\\fIRecord %d\\fP\n", record++);
+			}
+			if (opt_border >= 1)
+				fputs("_\n", fout);
+		}
+
+		if (!opt_barebones)
+		{
+			if (current_format != 2)
+			{
+				if (current_format != 0)
+					fputs(".T&\n", fout);
+				if (opt_border != 1)
+					fputs("c l.\n", fout);
+				else
+					fputs("c | l.\n", fout);
+				current_format = 2;
+			}
+		}
+
+		troff_ms_escaped_print(headers[i % col_count], fout);
+		fputc('\t', fout);
+		troff_ms_escaped_print(*ptr, fout);
+		fputc('\n', fout);
+	}
+
+	fputs(".TE\n.DS L\n", fout);
+
+
+	/* print footers */
+
+	if (footers && !opt_barebones)
+		for (ptr = footers; *ptr; ptr++)
+		{
+			troff_ms_escaped_print(*ptr, fout);
+			fputc('\n', fout);
+		}
+
+	fputs(".DE\n", fout);
+}
+
+
+
/********************************/
/* Public functions		*/
/********************************/
@@ -1113,6 +1323,12 @@
else
print_latex_text(title, headers, cells, footers, align, opt->tuples_only, border, output);
break;
+		case PRINT_TROFF_MS:
+			if (opt->expanded)
+				print_troff_ms_vertical(title, headers, cells, footers, align, opt->tuples_only, border, output);
+			else
+				print_troff_ms_text(title, headers, cells, footers, align, opt->tuples_only, border, output);
+			break;
default:
fprintf(stderr, "+ Oops, you shouldn't see this!\n");
}
Index: src/bin/psql/print.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.h,v
retrieving revision 1.20
diff -u -r1.20 print.h
--- src/bin/psql/print.h	29 Nov 2003 19:52:07 -0000	1.20
+++ src/bin/psql/print.h	1 Aug 2004 17:36:56 -0000
@@ -21,7 +21,8 @@
PRINT_UNALIGNED,
PRINT_ALIGNED,
PRINT_HTML,
-	PRINT_LATEX
+	PRINT_LATEX,
+	PRINT_TROFF_MS
/* add your favourite output format here ... */
};

Content-Description: Troff -ms generated source

[ Attachment, skipping... ]

Content-Description: Troff -ms postscript output

[ Attachment, skipping... ]

Content-Description: LaTeX generated source

[ Attachment, skipping... ]

Content-Description: LaTeX PDF output

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
#3Christopher Kings-Lynne
chriskl@familyhealth.com.au
In reply to: Bruce Momjian (#2)
Re: Troff -ms output for psql

You mean 8.1 release :P

Bruce Momjian wrote:

Show quoted text

This has been saved for the 7.6 release:

http:/momjian.postgresql.org/cgi-bin/pgpatches2

#4Bruce Momjian
bruce@momjian.us
In reply to: Christopher Kings-Lynne (#3)
Re: Troff -ms output for psql

Perhaps. :-)

---------------------------------------------------------------------------

Christopher Kings-Lynne wrote:

You mean 8.1 release :P

Bruce Momjian wrote:

This has been saved for the 7.6 release:

http:/momjian.postgresql.org/cgi-bin/pgpatches2

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
#5Bruce Momjian
bruce@momjian.us
In reply to: Roger Leigh (#1)
Re: Troff -ms output for psql

Patch applied, thanks.

Following the commit of my psql latex format fixes, I've re-done the
patch for the troff-ms format which previously included this patch.
It's identical to the original but with the latex hunks removed.

---------------------------------------------------------------------------

Roger Leigh wrote:

Hello,

I've created a patch which adds support for troff "-ms" output to
psql. i.e. "\pset format troff-ms". The patch also corrects some
problems with the "latex" format, notably defining an extra column in
the output table, and correcting some alignment issues; it also
changes the output to match the border setting as documented in the
manual page and as shown with the "aligned" format.

The troff-ms output is mostly identical to the latex output allowing
for the differences between the two typesetters.

The output should be saved in a file and piped as follows:

cat file | tbl | troff -T ps -ms > file.ps
or
tbl file | troff -T ps -ms > file.ps

Because it contains tabs, you'll need to redirect psql output or use
"script", rather than pasting from a terminal window, due to the tabs
which can be replaced with spaces.

I've attached the patch (against the current mainline), and example
output of each for each of border=[123] and expanded mode on and off
(both source and printable copy).

Regards,
Roger

PS. I'm not subscribed, so I would appreciate a CC on any replies.
Thanks!

--
Roger Leigh

Printing on GNU/Linux? http://gimp-print.sourceforge.net/
GPG Public Key: 0x25BFB848. Please sign and encrypt your mail.

Content-Description: patch to add troff output to psql

Content-Description: Troff -ms generated source

[ Attachment, skipping... ]

Content-Description: Troff -ms postscript output

[ Attachment, skipping... ]

Content-Description: LaTeX generated source

[ Attachment, skipping... ]

Content-Description: LaTeX PDF output

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to majordomo@postgresql.org)

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073