aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/fmt
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@FreeBSD.org>2002-01-11 19:06:48 +0000
committerRuslan Ermilov <ru@FreeBSD.org>2002-01-11 19:06:48 +0000
commitdeba2451768df7509013747bcbbf1ad926f2d9d5 (patch)
tree7e240be41e04dd191e5ec747a5891b2e69a10e4a /usr.bin/fmt
parentb9c35b6942ca57329cf7d0604c2274f0c92aaac1 (diff)
downloadsrc-deba2451768df7509013747bcbbf1ad926f2d9d5.tar.gz
src-deba2451768df7509013747bcbbf1ad926f2d9d5.zip
Don't format lines that look like troff requests, for
compatibility with old fmt(1). New option -n permits formatting of lines beginning with a dot character. PR: bin/31392 MFC after: 3 days
Notes
Notes: svn path=/head/; revision=89268
Diffstat (limited to 'usr.bin/fmt')
-rw-r--r--usr.bin/fmt/fmt.110
-rw-r--r--usr.bin/fmt/fmt.c23
2 files changed, 28 insertions, 5 deletions
diff --git a/usr.bin/fmt/fmt.1 b/usr.bin/fmt/fmt.1
index b1333ae1fa56..6c9862f4d607 100644
--- a/usr.bin/fmt/fmt.1
+++ b/usr.bin/fmt/fmt.1
@@ -42,7 +42,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
@@ -88,6 +88,14 @@ 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 nroff 1 .
.It Fl p
Allow indented paragraphs.
Without the
diff --git a/usr.bin/fmt/fmt.c b/usr.bin/fmt/fmt.c
index a40e2fe754eb..f7ea0ab0ad5b 100644
--- a/usr.bin/fmt/fmt.c
+++ b/usr.bin/fmt/fmt.c
@@ -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
@@ -222,6 +224,7 @@ static int tab_width=8; /* Number of spaces per tab stop */
static size_t output_tab_width=8; /* 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 */
@@ -257,10 +260,11 @@ 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;
+ format_troff = 1;
continue;
case 'd':
sentence_enders = optarg;
@@ -272,6 +276,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;
@@ -307,6 +314,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"
@@ -395,6 +403,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 (and we don't format troff),
* OR it's a mail header,
* OR it's not a mail header AND the last line was one,
* OR the indentation has changed
@@ -402,6 +411,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
@@ -412,8 +422,11 @@ process_stream(FILE *stream, const char *name) {
first_indent = np;
last_indent = np;
if (header_type==hdr_Header) last_indent=2; /* for cont. lines */
- if (length==0) {
- putchar('\n');
+ if (length==0 || (line[0]=='.' && !format_troff)) {
+ if (length==0)
+ putchar('\n');
+ else
+ printf("%.*s\n", (int)length, line);
prev_header_type=hdr_ParagraphStart;
continue;
}
@@ -594,11 +607,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 (isprint(ch)) {
+ else if (troff || isprint(ch)) {
while (len+spaces_pending >= length) {
length*=2; buf=xrealloc(buf, length);
}