Add fold utility from FreeBSD 2.0.

This commit is contained in:
Sergey
2015-07-04 18:54:09 -07:00
parent 1bf595e11a
commit 0329394f94
6 changed files with 261 additions and 5 deletions

View File

@@ -452,6 +452,7 @@ file /bin/false
file /bin/fgrep file /bin/fgrep
file /bin/file file /bin/file
file /bin/find file /bin/find
file /bin/fold
file /bin/forth file /bin/forth
file /bin/fstat file /bin/fstat
mode 02755 mode 02755

View File

@@ -10,14 +10,14 @@ CFLAGS += -Werror
# Programs that live in subdirectories, and have makefiles of their own. # Programs that live in subdirectories, and have makefiles of their own.
# /bin # /bin
SUBDIR = adb adc-demo aout ar as awk basic cc chflags chpass \ SUBDIR = adb adc-demo aout ar as awk basic calendar cc chflags \
cpp dc diff emg env fdisk find forth fstat glcdtest \ chpass cpp dc diff emg env fdisk find fold forth fstat \
hostname id la lcc lcpp ld ls login make man md5 med \ glcdtest hostname id la lcc lcpp ld ls login make man \
more nm passwd picoc portio printf pwm \ md5 med more nm passwd picoc portio printf pwm \
ranlib re renice retroforth scm setty sl \ ranlib re renice retroforth scm setty sl \
sed sh smallc smlrc stty sysctl test uname wiznet xargs \ sed sh smallc smlrc stty sysctl test uname wiznet xargs \
zmodem gtest msec unixbench cron compress date2 tip \ zmodem gtest msec unixbench cron compress date2 tip \
talloc devupdate uucp smux calendar talloc devupdate uucp smux
# /sbin # /sbin
SUBDIR += chown chroot disktool fsck getty init \ SUBDIR += chown chroot disktool fsck getty init \

1
src/cmd/fold/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
fold

38
src/cmd/fold/Makefile Normal file
View File

@@ -0,0 +1,38 @@
TOPSRC = $(shell cd ../../..; pwd)
include $(TOPSRC)/target.mk
CFLAGS = -O
SRCS = fold.c
OBJS = fold.o
MAN = fold.0
MANSRC = fold.1
all: fold $(MAN)
fold: ${OBJS}
${CC} ${LDFLAGS} -o fold.elf ${OBJS} ${LIBS}
${OBJDUMP} -S fold.elf > fold.dis
${SIZE} fold.elf
${ELF2AOUT} fold.elf $@ && rm fold.elf
$(MAN): ${MANSRC}
${MANROFF} $< > $@
clean:
rm -f *.o fold fold.elf fold.dis tags *~ fold.0
depend: ${SRCS}
mkdep ${CFLAGS} ${SRCS}
install: all
install fold ${DESTDIR}/bin/fold
cp ${MAN} ${DESTDIR}/share/man/cat1/
lint: ${SRCS}
lint -hax ${SRCS}
tags: ${SRCS}
ctags ${SRCS}
# DO NOT DELETE THIS LINE -- mkdep uses it.
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.

64
src/cmd/fold/fold.1 Normal file
View File

@@ -0,0 +1,64 @@
.\" Copyright (c) 1980, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed by the University of
.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)fold.1 8.1 (Berkeley) 6/6/93
.\"
.Dd June 6, 1993
.Dt FOLD 1
.Os
.Sh NAME
.Nm fold
.Nd "fold long lines for finite width output device"
.Sh SYNOPSIS
.Nm fold
.Op Fl w Ar width
.Ar
.Sh DESCRIPTION
.Nm Fold
is a filter which folds the contents of the specified files,
or the standard input if no files are specified,
breaking the lines to have maximum of 80 characters.
.Pp
The options are as follows:
.Bl -tag -width indent
.It Fl w
Specifies a line width to use instead of the default 80 characters.
.Ar Width
should be a multiple of 8 if tabs are present, or the tabs should
be expanded using
.Xr expand 1
before using
.Nm fold .
.El
.Sh SEE ALSO
.Xr expand 1
.Sh BUGS
If underlining is present it may be messed up by folding.

152
src/cmd/fold/fold.c Normal file
View File

@@ -0,0 +1,152 @@
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Kevin Ruddy.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1990, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
static char sccsid[] = "@(#)fold.c 8.1 (Berkeley) 6/6/93";
#endif /* not lint */
#include <stdio.h>
#include <string.h>
#define DEFLINEWIDTH 80
main(argc, argv)
int argc;
char **argv;
{
extern int errno, optind;
extern char *optarg;
register int ch;
int width;
char *p;
width = -1;
while ((ch = getopt(argc, argv, "0123456789w:")) != EOF)
switch (ch) {
case 'w':
if ((width = atoi(optarg)) <= 0) {
(void)fprintf(stderr,
"fold: illegal width value.\n");
exit(1);
}
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
if (width == -1) {
p = argv[optind - 1];
if (p[0] == '-' && p[1] == ch && !p[2])
width = atoi(++p);
else
width = atoi(argv[optind] + 1);
}
break;
default:
(void)fprintf(stderr,
"usage: fold [-w width] [file ...]\n");
exit(1);
}
argv += optind;
argc -= optind;
if (width == -1)
width = DEFLINEWIDTH;
if (!*argv)
fold(width);
else for (; *argv; ++argv)
if (!freopen(*argv, "r", stdin)) {
(void)fprintf(stderr,
"fold: %s: %s\n", *argv, strerror(errno));
exit(1);
} else
fold(width);
exit(0);
}
fold(width)
register int width;
{
register int ch, col, new;
for (col = 0;;) {
switch (ch = getchar()) {
case EOF:
return;
case '\b':
new = col ? col - 1 : 0;
break;
case '\n':
case '\r':
new = 0;
break;
case '\t':
new = (col + 8) & ~7;
break;
default:
new = col + 1;
break;
}
if (new > width) {
putchar('\n');
col = 0;
}
putchar(ch);
switch (ch) {
case '\b':
if (col > 0)
--col;
break;
case '\n':
case '\r':
col = 0;
break;
case '\t':
col += 8;
col &= ~7;
break;
default:
++col;
break;
}
}
}