/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1992-2012 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* 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
/*
* David Korn
* AT&T Bell Laboratories
*
* fold
*/
static const char usage[] =
"[-?\n@(#)$Id: fold (AT&T Research) 2004-11-18 $\n]"
"[+NAME?fold - fold lines]"
"[+DESCRIPTION?\bfold\b is a filter that folds lines from its input, "
"breaking the lines to have a maximum of \awidth\a column "
"positions (or bytes if the \b-b\b option is specified). Lines "
"are broken by the insertion of a newline character such that "
"each output line is the maximum width possible that does not "
"exceed the specified number of column positions, (or bytes). A line "
"will not be broken in the middle of a character.] "
"[+?Unless the \b-b\b option is specified, the following will be treated "
"specially:]{"
"[+carriage-return?The current count of line width will be set "
"to zero. \bfold\b will not insert a newline immediately "
"before or after a carriage-return.]"
"[+backspace?If positive, the current count of line width will be "
"decremented by one. \bfold\b will not insert a newline "
"immediately before or after a backspace.]"
"[+tab?Each tab character encountered will advance the column "
"position to the next tab stop. Tab stops are at each "
"column position \an\a, where \an\a modulo 8 equals 1.]"
"}"
"[+?If no \afile\a is given, or if the \afile\a is \b-\b, \bfold\b "
"reads from standard input. The start of the file is defined "
"as the current offset.]"
"[b:bytes?Count bytes rather than columns so that each carriage-return, "
"backspace, and tab counts as 1.]"
"[c:continue?Emit \atext\a at line splits.]:[text:='\\n']"
"[d:delimiter?Break at \adelim\a boundaries.]:[delim]"
"[s:spaces?Break at word boundaries. If the line contains any blanks, "
"(spaces or tabs), within the first \awidth\a column positions or "
"bytes, the line is broken after the last blank meeting the "
"\awidth\a constraint.]"
"[w:width]#[width:=80?Use a maximum line length of \awidth\a columns "
"instead of the default.]"
"\n"
"\n[file ...]\n"
"\n"
"[+EXIT STATUS?]{"
"[+0?All files processed successfully.]"
"[+>0?An error occurred.]"
"}"
"[+SEE ALSO?\bpaste\b(1)]"
;
#include <cmd.h>
static void fold(Sfio_t *in, Sfio_t *out, register int width, const char *cont, size_t contsize, char *cols)
{
register int n, col=0, x=0;
register char *last_space=0;
cols[0] = 0;
for (;;)
{
{
break;
x = cp[--n];
cp[n] = '\n';
}
/* special case -b since no column adjustment is needed */
{
continue;
}
col = 0;
last_space = 0;
for(;;)
{
{
if(last_space)
else
col = 0;
last_space = 0;
}
switch(n)
{
case T_NL:
if(x)
*(cp-1) = x;
break;
case T_RET:
col = 0;
continue;
case T_BS:
col--;
continue;
case T_TAB:
col +=n;
{
last_space = 0;
continue;
}
if(cols[' '])
last_space = cp;
continue;
case T_SP:
last_space = cp;
continue;
default:
continue;
}
break;
}
}
}
int
{
register char *cp;
for (;;)
{
{
case 'b':
continue;
case 'c':
continue;
case 'd':
continue;
case 's':
if(cols['\t']==0)
continue;
case 'w':
continue;
case ':':
continue;
case '?':
continue;
}
break;
}
if(error_info.errors)
argv++;
do
{
{
continue;
}
}
return(error_info.errors);
}