From deba2451768df7509013747bcbbf1ad926f2d9d5 Mon Sep 17 00:00:00 2001 From: Ruslan Ermilov Date: Fri, 11 Jan 2002 19:06:48 +0000 Subject: 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 --- usr.bin/fmt/fmt.1 | 10 +++++++++- usr.bin/fmt/fmt.c | 23 +++++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) (limited to 'usr.bin/fmt') 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 double-space after at line end\n" " -l turn each 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 have tabs every 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); } -- cgit v1.2.3