summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/fmt/fmt.117
-rw-r--r--usr.bin/fmt/fmt.c24
2 files changed, 34 insertions, 7 deletions
diff --git a/usr.bin/fmt/fmt.1 b/usr.bin/fmt/fmt.1
index 67a934acbac..d5bddd7ab42 100644
--- a/usr.bin/fmt/fmt.1
+++ b/usr.bin/fmt/fmt.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: fmt.1,v 1.14 2001/11/28 22:09:28 millert Exp $
+.\" $OpenBSD: fmt.1,v 1.15 2001/11/29 00:33:06 millert Exp $
.\"
.\" Copyright (c) 1980, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -41,7 +41,7 @@
.Nd simple text formatter
.Sh SYNOPSIS
.Nm fmt
-.Op Fl cmps
+.Op Fl cmnps
.Op Fl d Ar chars
.Op Fl l Ar num
.Op Fl t Ar num
@@ -93,6 +93,16 @@ In this case, most of the other
options are ignored; no splitting or joining of lines is done.
.It Fl m
Try to format mail header lines contained in the input sensibly.
+.It Fl n
+Format lines beginning with a
+.Ql \&.
+(dot) character.
+Normally,
+.Nm
+does not fill these lines, for compatibility with
+.Xr troff 1
+and
+.Xr nroff 1 .
.It Fl p
Allow indented paragraphs.
Without the
@@ -145,7 +155,8 @@ will reformat a paragraph,
evening the lines.
.Sh SEE ALSO
.Xr mail 1 ,
-.Xr nroff 1
+.Xr nroff 1 ,
+.Xr troff 1
.Sh HISTORY
The
.Nm
diff --git a/usr.bin/fmt/fmt.c b/usr.bin/fmt/fmt.c
index a77ef1485ff..ac3c6c09349 100644
--- a/usr.bin/fmt/fmt.c
+++ b/usr.bin/fmt/fmt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fmt.c,v 1.18 2001/11/28 22:01:42 millert Exp $ */
+/* $OpenBSD: fmt.c,v 1.19 2001/11/29 00:33:06 millert Exp $ */
/* Sensible version of fmt
*
@@ -30,6 +30,8 @@
* preceded by a non-blank non-message-header line, is
* taken to start a new paragraph, which also contains
* any subsequent lines with non-empty leading whitespace.
+ * Unless the `-n' option is given, lines beginning with
+ * a . (dot) are not formatted.
* 3. The "everything else" is split into words; a word
* includes its trailing whitespace, and a word at the
* end of a line is deemed to be followed by a single
@@ -168,7 +170,7 @@
#ifndef lint
static const char rcsid[] =
- "$OpenBSD: fmt.c,v 1.18 2001/11/28 22:01:42 millert Exp $";
+ "$OpenBSD: fmt.c,v 1.19 2001/11/29 00:33:06 millert Exp $";
static const char copyright[] =
"Copyright (c) 1997 Gareth McCaughan. All rights reserved.\n";
#endif /* not lint */
@@ -213,6 +215,7 @@ static int tab_width=8; /* Number of spaces per tab stop */
static size_t output_tab_width=0; /* Ditto, when squashing leading spaces */
static const char *sentence_enders=".?!"; /* Double-space after these */
static int grok_mail_headers=0; /* treat embedded mail headers magically? */
+static int format_troff=0; /* Format troff? */
static int n_errors=0; /* Number of failed files. Return on exit. */
static char *output_buffer=0; /* Output line will be built here */
@@ -248,7 +251,7 @@ main(int argc, char *argv[]) {
/* 1. Grok parameters. */
- while ((ch = getopt(argc, argv, "0123456789cd:hl:mpst:w:")) != -1)
+ while ((ch = getopt(argc, argv, "0123456789cd:hl:mnpst:w:")) != -1)
switch(ch) {
case 'c':
centerP = 1;
@@ -263,6 +266,9 @@ main(int argc, char *argv[]) {
case 'm':
grok_mail_headers = 1;
continue;
+ case 'n':
+ format_troff = 1;
+ continue;
case 'p':
allow_indented_paragraphs = 1;
continue;
@@ -298,6 +304,7 @@ main(int argc, char *argv[]) {
" -d <chars> double-space after <chars> at line end\n"
" -l <n> turn each <n> spaces at start of line into a tab\n"
" -m try to make sure mail header lines stay separate\n"
+" -n format lines beginning with a dot\n"
" -p allow indented paragraphs\n"
" -s coalesce whitespace inside lines\n"
" -t <n> have tabs every <n> columns\n"
@@ -386,6 +393,7 @@ process_stream(FILE *stream, const char *name) {
}
/* We need a new paragraph if and only if:
* this line is blank,
+ * OR it's a troff request,
* OR it's a mail header,
* OR it's not a mail header AND the last line was one,
* OR the indentation has changed
@@ -393,6 +401,7 @@ process_stream(FILE *stream, const char *name) {
* AND this isn't the second line of an indented paragraph.
*/
if ( length==0
+ || (line[0]=='.' && !format_troff)
|| header_type==hdr_Header
|| (header_type==hdr_NonHeader && prev_header_type>hdr_NonHeader)
|| (np!=last_indent
@@ -402,6 +411,11 @@ process_stream(FILE *stream, const char *name) {
para_line_number = 0;
first_indent = np;
last_indent = np;
+ /* nroff compatibility */
+ if (length>0 && line[0]=='.' && !format_troff) {
+ printf("%.*s\n", (int)length, line);
+ continue;
+ }
if (header_type==hdr_Header) last_indent=2; /* for cont. lines */
if (length==0) {
putchar('\n');
@@ -585,11 +599,13 @@ get_line(FILE *stream, size_t *lengthp) {
size_t len=0;
int ch;
size_t spaces_pending=0;
+ int troff=0;
if (buf==NULL) { length=100; buf=XMALLOC(length); }
while ((ch=getc(stream)) != '\n' && ch != EOF) {
+ if (len+spaces_pending==0 && ch=='.' && !format_troff) troff=1;
if (ch==' ') ++spaces_pending;
- else if (!iscntrl(ch)) {
+ else if (troff || !iscntrl(ch)) {
while (len+spaces_pending >= length) {
length*=2; buf=xrealloc(buf, length);
}