diff options
author | Andy Fiddaman <omnios@citrus-it.co.uk> | 2020-12-27 17:47:37 +0000 |
---|---|---|
committer | Andy Fiddaman <omnios@citrus-it.co.uk> | 2021-01-30 17:13:33 +0000 |
commit | b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f (patch) | |
tree | 6a37e590faffb9bb9af66887de645c546445036c /usr/src/lib/libcmd/common/fmt.c | |
parent | df36e06d12cbf655ddf22339ef8c39fa2b83ebf8 (diff) | |
download | illumos-joyent-b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f.tar.gz |
13405 ksh93 update to 2012-08-01
13434 sh: mishandles backslash as last character of a block of input
11750 ksh mkdir builtin doesn't honor special file permissions
9199 ksh93 builtin *grep -v mishandles blank lines, blows up libgcrypt-config
6756 sh (and ksh) have issues with ${1+"$@"}
6520 ksh: sleep could wait forever
4860 ksh93: core in printf
3791 /bin/sh's builtin 'rm' busted: 'rm -f' without arguments returns error
1047 ksh overwrites child core files
880 ksh93 coredumps on 'unset'
499 "interrupted system call" when using "tee" builtin in ksh
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Reviewed by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
Reviewed by: Dominik Hassler <hadfl@omnios.org>
Approved by: Rich Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/lib/libcmd/common/fmt.c')
-rw-r--r-- | usr/src/lib/libcmd/common/fmt.c | 632 |
1 files changed, 0 insertions, 632 deletions
diff --git a/usr/src/lib/libcmd/common/fmt.c b/usr/src/lib/libcmd/common/fmt.c deleted file mode 100644 index 2830e2191b..0000000000 --- a/usr/src/lib/libcmd/common/fmt.c +++ /dev/null @@ -1,632 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -static const char usage[] = -"[-?\n@(#)$Id: fmt (AT&T Research) 2007-01-02 $\n]" -USAGE_LICENSE -"[+NAME?fmt - simple text formatter]" -"[+DESCRIPTION?\bfmt\b reads the input files and left justifies space " - "separated words into lines \awidth\a characters or less in length and " - "writes the lines to the standard output. The standard input is read if " - "\b-\b or no files are specified. Blank lines and interword spacing are " - "preserved in the output. Indentation is preserved, and lines with " - "identical indentation are joined and justified.]" -"[+?\bfmt\b is meant to format mail messages prior to sending, but may " - "also be useful for other simple tasks. For example, in \bvi\b(1) the " - "command \b:!}fmt\b will justify the lines in the current paragraph.]" -"[c:crown-margin?Preserve the indentation of the first two lines within " - "a paragraph, and align the left margin of each subsequent line with " - "that of the second line.]" -"[o:optget?Format concatenated \boptget\b(3) usage strings.]" -"[s:split-only?Split lines only; do not join short lines to form longer " - "ones.]" -"[u:uniform-spacing?One space between words, two after sentences.]" -"[w:width?Set the output line width to \acolumns\a.]#[columns:=72]" - "\n\n" -"[ file ... ]" - "\n\n" -"[+SEE ALSO?\bmailx\b(1), \bnroff\b(1), \btroff\b(1), \bvi\b(1), " - "\boptget\b(3)]" -; - -#include <cmd.h> -#include <ctype.h> - -typedef struct Fmt_s -{ - long flags; - char* outp; - char* outbuf; - char* endbuf; - Sfio_t* in; - Sfio_t* out; - int indent; - int nextdent; - int nwords; - int prefix; - int quote; - int retain; - int section; -} Fmt_t; - -#define INDENT 4 -#define TABSZ 8 - -#define isoption(fp,c) ((fp)->flags&(1L<<((c)-'a'))) -#define setoption(fp,c) ((fp)->flags|=(1L<<((c)-'a'))) -#define clroption(fp,c) ((fp)->flags&=~(1L<<((c)-'a'))) - -static void -outline(Fmt_t* fp) -{ - register char* cp = fp->outbuf; - int n = 0; - int c; - int d; - - if (!fp->outp) - return; - while (fp->outp[-1] == ' ') - fp->outp--; - *fp->outp = 0; - while (*cp++ == ' ') - n++; - if (n >= TABSZ) - { - n /= TABSZ; - cp = &fp->outbuf[TABSZ*n]; - while (n--) - *--cp = '\t'; - } - else - cp = fp->outbuf; - fp->nwords = 0; - if (!isoption(fp, 'o')) - sfputr(fp->out, cp, '\n'); - else if (*cp) - { - n = fp->indent; - if (*cp != '[') - { - if (*cp == ' ') - cp++; - n += INDENT; - } - while (n--) - sfputc(fp->out, ' '); - if (fp->quote) - { - if ((d = (fp->outp - cp)) <= 0) - c = 0; - else if ((c = fp->outp[-1]) == 'n' && d > 1 && fp->outp[-2] == '\\') - c = '}'; - sfprintf(fp->out, "\"%s%s\"\n", cp, c == ']' || c == '{' || c == '}' ? "" : " "); - } - else - sfputr(fp->out, cp, '\n'); - if (fp->nextdent) - { - fp->indent += fp->nextdent; - fp->endbuf -= fp->nextdent; - fp->nextdent = 0; - } - } - fp->outp = 0; -} - -static void -split(Fmt_t* fp, char* buf, int splice) -{ - register char* cp; - register char* ep; - register char* qp; - register int c = 1; - register int q = 0; - register int n; - int prefix; - - for (ep = buf; *ep == ' '; ep++); - prefix = ep - buf; - - /* - * preserve blank lines - */ - - if ((*ep == 0 || *buf == '.') && !isoption(fp, 'o')) - { - if (*ep) - prefix = strlen(buf); - outline(fp); - strcpy(fp->outbuf, buf); - fp->outp = fp->outbuf+prefix; - outline(fp); - return; - } - if (fp->prefix < prefix && !isoption(fp, 'c')) - outline(fp); - if (!fp->outp || prefix < fp->prefix) - fp->prefix = prefix; - while (c) - { - cp = ep; - while (*ep == ' ') - ep++; - if (cp != ep && isoption(fp, 'u')) - cp = ep-1; - while (c = *ep) - { - if (c == ' ') - break; - ep++; - - /* - * skip over \space - */ - - if (c == '\\' && *ep) - ep++; - } - n = (ep-cp); - if (n && isoption(fp, 'o')) - { - for (qp = cp; qp < ep; qp++) - if (*qp == '\\') - qp++; - else if (*qp == '"') - q = !q; - if (*(ep-1) == '"') - goto skip; - } - if (fp->nwords > 0 && &fp->outp[n] >= fp->endbuf && !fp->retain && !q) - outline(fp); - skip: - if (fp->nwords == 0) - { - if (fp->prefix) - memset(fp->outbuf, ' ', fp->prefix); - fp->outp = &fp->outbuf[fp->prefix]; - while (*cp == ' ') - cp++; - n = (ep-cp); - } - memcpy(fp->outp, cp, n); - fp->outp += n; - fp->nwords++; - } - if (isoption(fp, 's') || *buf == 0) - outline(fp); - else if (fp->outp) - { - /* - * two spaces at ends of sentences - */ - - if (!isoption(fp, 'o') && strchr(".:!?", fp->outp[-1])) - *fp->outp++ = ' '; - 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] != ' ')) - *fp->outp++ = ' '; - } -} - -static int -dofmt(Fmt_t* fp) -{ - register int c; - int b; - int x; - int splice; - char* cp; - char* dp; - char* ep; - char* lp; - char* tp; - char buf[8192]; - - cp = 0; - 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))) - { - if (isoption(fp, 'o')) - { - if (!isoption(fp, 'i')) - { - setoption(fp, 'i'); - b = 0; - while (cp < lp) - { - if (*cp == ' ') - b += 1; - else if (*cp == '\t') - b += INDENT; - else - break; - cp++; - } - fp->indent = roundof(b, INDENT); - } - else - while (cp < lp && (*cp == ' ' || *cp == '\t')) - cp++; - if (!isoption(fp, 'q') && cp < lp) - { - setoption(fp, 'q'); - if (*cp == '"') - { - ep = lp; - while (--ep > cp) - if (*ep == '"') - { - fp->quote = 1; - break; - } - else if (*ep != ' ' && *ep != '\t') - break; - } - } - } - again: - dp = buf; - ep = 0; - for (b = 1;; b = 0) - { - if (cp >= lp) - { - cp = 0; - break; - } - c = *cp++; - if (isoption(fp, 'o')) - { - if (c == '\\') - { - x = 0; - c = ' '; - cp--; - while (cp < lp) - { - if (*cp == '\\') - { - cp++; - if ((lp - cp) < 1) - { - c = '\\'; - break; - } - if (*cp == 'n') - { - cp++; - c = '\n'; - if ((lp - cp) > 2) - { - if (*cp == ']' || *cp == '@' && *(cp + 1) == '(') - { - *dp++ = '\\'; - *dp++ = 'n'; - c = *cp++; - break; - } - if (*cp == '\\' && *(cp + 1) == 'n') - { - cp += 2; - *dp++ = '\n'; - break; - } - } - } - else if (*cp == 't' || *cp == ' ') - { - cp++; - x = 1; - c = ' '; - } - else - { - if (x && dp != buf && *(dp - 1) != ' ') - *dp++ = ' '; - *dp++ = '\\'; - c = *cp++; - break; - } - } - else if (*cp == ' ' || *cp == '\t') - { - cp++; - c = ' '; - x = 1; - } - else - { - if (x && c != '\n' && dp != buf && *(dp - 1) != ' ') - *dp++ = ' '; - break; - } - } - if (c == '\n') - { - c = 0; - goto flush; - } - if (c == ' ' && (dp == buf || *(dp - 1) == ' ')) - continue; - } - else if (c == '"') - { - if (b || cp >= lp) - { - if (fp->quote) - continue; - fp->section = 0; - } - } - else if (c == '\a') - { - *dp++ = '\\'; - c = 'a'; - } - else if (c == '\b') - { - *dp++ = '\\'; - c = 'b'; - } - else if (c == '\f') - { - *dp++ = '\\'; - c = 'f'; - } - else if (c == '\v') - { - *dp++ = '\\'; - c = 'v'; - } - else if (c == ']' && (cp >= lp || *cp != ':' && *cp != '#' && *cp != '!')) - { - if (cp < lp && *cp == ']') - { - cp++; - *dp++ = c; - } - else - { - fp->section = 1; - fp->retain = 0; - flush: - *dp++ = c; - *dp = 0; - split(fp, buf, 0); - outline(fp); - goto again; - } - } - else if (fp->section) - { - if (c == '[') - { - if (b) - fp->retain = 1; - else - { - cp--; - c = 0; - goto flush; - } - fp->section = 0; - } - else if (c == '{') - { - x = 1; - for (tp = cp; tp < lp; tp++) - { - if (*tp == '[' || *tp == '\n') - break; - if (*tp == ' ' || *tp == '\t' || *tp == '"') - continue; - if (*tp == '\\' && (lp - tp) > 1) - { - if (*++tp == 'n') - break; - if (*tp == 't' || *tp == '\n') - continue; - } - x = 0; - break; - } - if (x) - { - if (fp->endbuf > (fp->outbuf + fp->indent + 2*INDENT)) - fp->nextdent = 2*INDENT; - goto flush; - } - else - fp->section = 0; - } - else if (c == '}') - { - if (fp->indent && (b || *(cp - 2) != 'f')) - { - if (b) - { - fp->indent -= 2*INDENT; - fp->endbuf += 2*INDENT; - } - else - { - cp--; - c = 0; - } - goto flush; - } - else - fp->section = 0; - } - else if (c == ' ' || c == '\t') - continue; - else - fp->section = 0; - } - else if (c == '?' && (cp >= lp || *cp != '?')) - { - if (fp->retain) - { - cp--; - while (cp < lp && *cp != ' ' && *cp != '\t' && *cp != ']' && dp < &buf[sizeof(buf)-3]) - *dp++ = *cp++; - if (cp < lp && (*cp == ' ' || *cp == '\t')) - *dp++ = *cp++; - *dp = 0; - split(fp, buf, 0); - dp = buf; - ep = 0; - fp->retain = 0; - if (fp->outp >= fp->endbuf) - outline(fp); - continue; - } - } - else if (c == ' ' || c == '\t') - for (c = ' '; *cp == ' ' || *cp == '\t'; cp++); - } - else if (c == '\b') - { - if (dp > buf) - { - dp--; - if (ep) - ep--; - } - continue; - } - else if (c == '\t') - { - /* - * expand tabs - */ - - if (!ep) - ep = dp; - c = isoption(fp, 'o') ? 1 : TABSZ - (dp - buf) % TABSZ; - if (dp >= &buf[sizeof(buf) - c - 3]) - { - cp--; - break; - } - while (c-- > 0) - *dp++ = ' '; - continue; - } - else if (!isprint(c)) - continue; - if (dp >= &buf[sizeof(buf) - 3]) - { - tp = dp; - while (--tp > buf) - if (isspace(*tp)) - { - cp -= dp - tp; - dp = tp; - break; - } - ep = 0; - break; - } - if (c != ' ') - ep = 0; - else if (!ep) - ep = dp; - *dp++ = c; - } - if (ep) - *ep = 0; - else - *dp = 0; - split(fp, buf, splice); - } - return 0; -} - -int -b_fmt(int argc, char** argv, void *context) -{ - register int n; - char* cp; - Fmt_t fmt; - char outbuf[8 * 1024]; - - fmt.flags = 0; - fmt.out = sfstdout; - fmt.outbuf = outbuf; - fmt.outp = 0; - fmt.endbuf = &outbuf[72]; - fmt.indent = 0; - fmt.nextdent = 0; - fmt.nwords = 0; - fmt.prefix = 0; - fmt.quote = 0; - fmt.retain = 0; - fmt.section = 1; - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) - switch (n) - { - case 'c': - case 'o': - case 's': - case 'u': - setoption(&fmt, n); - break; - case 'w': - if (opt_info.num < TABSZ || opt_info.num>= sizeof(outbuf)) - error(2, "width out of range"); - fmt.endbuf = &outbuf[opt_info.num]; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (isoption(&fmt, 'o')) - setoption(&fmt, 'c'); - if (isoption(&fmt, 's')) - clroption(&fmt, 'u'); - if (cp = *argv) - argv++; - do { - if (!cp || streq(cp, "-")) - fmt.in = sfstdin; - else if (!(fmt.in = sfopen(NiL, cp, "r"))) - { - error(ERROR_system(0), "%s: cannot open", cp); - error_info.errors = 1; - continue; - } - dofmt(&fmt); - if (fmt.in != sfstdin) - sfclose(fmt.in); - } while (cp = *argv++); - outline(&fmt); - if (sfsync(sfstdout)) - error(ERROR_system(0), "write error"); - return error_info.errors != 0; -} |