da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[-?\n@(#)$Id: fmt (AT&T Research) 2007-01-02 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+NAME?fmt - simple text formatter]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+DESCRIPTION?\bfmt\b reads the input files and left justifies space "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "separated words into lines \awidth\a characters or less in length and "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "writes the lines to the standard output. The standard input is read if "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "\b-\b or no files are specified. Blank lines and interword spacing are "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "preserved in the output. Indentation is preserved, and lines with "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "identical indentation are joined and justified.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+?\bfmt\b is meant to format mail messages prior to sending, but may "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "also be useful for other simple tasks. For example, in \bvi\b(1) the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "command \b:!}fmt\b will justify the lines in the current paragraph.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[c:crown-margin?Preserve the indentation of the first two lines within "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "a paragraph, and align the left margin of each subsequent line with "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "that of the second line.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[o:optget?Format concatenated \boptget\b(3) usage strings.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[s:split-only?Split lines only; do not join short lines to form longer "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[u:uniform-spacing?One space between words, two after sentences.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[w:width?Set the output line width to \acolumns\a.]#[columns:=72]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[ file ... ]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+SEE ALSO?\bmailx\b(1), \bnroff\b(1), \btroff\b(1), \bvi\b(1), "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "\boptget\b(3)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (n--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (n--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((c = fp->outp[-1]) == 'n' && d > 1 && fp->outp[-2] == '\\')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(fp->out, "\"%s%s\"\n", cp, c == ']' || c == '{' || c == '}' ? "" : " ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int q = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * preserve blank lines
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *ep)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == ' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * skip over \space
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fp->nwords > 0 && &fp->outp[n] >= fp->endbuf && !fp->retain && !q)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * two spaces at ends of sentences
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!isoption(fp, 'o') && strchr(".:!?", fp->outp[-1]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!splice && !fp->retain && (!fp->quote || (fp->outp - fp->outbuf) < 2 || fp->outp[-2] != '\\' || fp->outp[-1] != 'n' && fp->outp[-1] != 't' && fp->outp[-1] != ' '))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (cp || (cp = sfgetr(fp->in, '\n', 0)) && !(splice = 0) && (lp = cp + sfvalue(fp->in) - 1) || (cp = sfgetr(fp->in, '\n', SF_LASTR)) && (splice = 1) && (lp = cp + sfvalue(fp->in)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (b = 1;; b = 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '\\')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '"')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '\a')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '\b')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '\f')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '\v')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == ']' && (cp >= lp || *cp != ':' && *cp != '#' && *cp != '!'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '[')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '{')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '}')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (cp < lp && *cp != ' ' && *cp != '\t' && *cp != ']' && dp < &buf[sizeof(buf)-3])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '\b')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '\t')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * expand tabs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = isoption(fp, 'o') ? 1 : TABSZ - (dp - buf) % TABSZ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c-- > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!isprint(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c != ' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!ep)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (n)