Add mandoc-manpage for fold(1) and refactor code
and mark it as finished in the README. In the code, use size_t rather than long.
This commit is contained in:
parent
6f73cd1c97
commit
f5b7e549b8
69
fold.1
69
fold.1
|
@ -1,25 +1,44 @@
|
||||||
.TH FOLD 1 sbase\-VERSION
|
.Dd January 25th, 2015
|
||||||
.SH NAME
|
.Dt FOLD 1 sbase\-VERSION
|
||||||
fold \- wrap lines to width
|
.Sh NAME
|
||||||
.SH SYNOPSIS
|
.Nm fold
|
||||||
.B fold
|
.Nd wrap lines to width
|
||||||
.RB [ \-bs ]
|
.Sh SYNOPSIS
|
||||||
.RB [ \-w
|
.Nm fold
|
||||||
.IR width ]
|
.Op Fl bs
|
||||||
.RI [ file ...]
|
.Op Fl w Ar width
|
||||||
.SH DESCRIPTION
|
.Op Fl N
|
||||||
.B fold
|
.Op Ar file ...
|
||||||
reads each file in sequence and prints its lines, broken such that no line
|
.Sh DESCRIPTION
|
||||||
exceeds 80 UTF-8 characters. If no file is given, fold reads from stdin.
|
.Nm
|
||||||
.SH OPTIONS
|
reads each
|
||||||
.TP
|
.Ar file
|
||||||
.B \-b
|
and prints its lines wrapped such that no line
|
||||||
counts bytes rather than characters.
|
exceeds a certain width.
|
||||||
.TP
|
If no file is given,
|
||||||
.B \-s
|
.Nm
|
||||||
breaks only at spaces.
|
reads from stdin.
|
||||||
.TP
|
.Sh OPTIONS
|
||||||
.BI \-w " width"
|
.Bl -tag -width Ds
|
||||||
breaks at
|
.It Fl b
|
||||||
.I width
|
Count bytes rather than characters.
|
||||||
characters, instead of 80.
|
.It Fl s
|
||||||
|
If a line contains spaces, break
|
||||||
|
at the last space within
|
||||||
|
.Ar width .
|
||||||
|
.It Fl w Ar width | Fl N
|
||||||
|
Break at
|
||||||
|
.Ar width
|
||||||
|
.Sy | N
|
||||||
|
characters. Default is 80.
|
||||||
|
.El
|
||||||
|
.Sh STANDARDS
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility is compliant with the
|
||||||
|
.St -p1003.1-2008
|
||||||
|
specification.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Op Fl N
|
||||||
|
flag is an extension to that specification.
|
||||||
|
|
119
fold.c
119
fold.c
|
@ -4,25 +4,74 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "text.h"
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static void fold(FILE *, long);
|
|
||||||
static void foldline(const char *, long);
|
|
||||||
|
|
||||||
static int bflag = 0;
|
static int bflag = 0;
|
||||||
static int sflag = 0;
|
static int sflag = 0;
|
||||||
|
|
||||||
|
static void
|
||||||
|
foldline(const char *str, size_t width)
|
||||||
|
{
|
||||||
|
int space;
|
||||||
|
size_t i = 0, n = 0, col, j;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
do {
|
||||||
|
space = 0;
|
||||||
|
for (j = i, col = 0; str[j] && col <= width; j++) {
|
||||||
|
c = str[j];
|
||||||
|
if (!UTF8_POINT(c) && !bflag)
|
||||||
|
continue;
|
||||||
|
if (sflag && isspace(c)) {
|
||||||
|
space = 1;
|
||||||
|
n = j + 1;
|
||||||
|
}
|
||||||
|
else if (!space)
|
||||||
|
n = j;
|
||||||
|
|
||||||
|
if (!bflag && iscntrl(c))
|
||||||
|
switch(c) {
|
||||||
|
case '\b':
|
||||||
|
col--;
|
||||||
|
break;
|
||||||
|
case '\r':
|
||||||
|
col = 0;
|
||||||
|
break;
|
||||||
|
case '\t':
|
||||||
|
col += (col + 1) % 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
if (fwrite(&str[i], 1, n - i, stdout) != n - i)
|
||||||
|
eprintf("<stdout>: write error:");
|
||||||
|
if (str[n])
|
||||||
|
putchar('\n');
|
||||||
|
} while (str[i = n] && str[i] != '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fold(FILE *fp, long width)
|
||||||
|
{
|
||||||
|
char *buf = NULL;
|
||||||
|
size_t size = 0;
|
||||||
|
|
||||||
|
while (getline(&buf, &size, fp) != -1)
|
||||||
|
foldline(buf, width);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
eprintf("usage: %s [-bs] [-w width] [FILE...]\n", argv0);
|
eprintf("usage: %s [-bs] [-w width] [-N] [FILE...]\n", argv0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
long width = 80;
|
size_t width = 80;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
ARGBEGIN {
|
ARGBEGIN {
|
||||||
|
@ -42,9 +91,9 @@ main(int argc, char *argv[])
|
||||||
usage();
|
usage();
|
||||||
} ARGEND;
|
} ARGEND;
|
||||||
|
|
||||||
if (argc == 0) {
|
if (argc == 0)
|
||||||
fold(stdin, width);
|
fold(stdin, width);
|
||||||
} else {
|
else {
|
||||||
for (; argc > 0; argc--, argv++) {
|
for (; argc > 0; argc--, argv++) {
|
||||||
if (!(fp = fopen(argv[0], "r"))) {
|
if (!(fp = fopen(argv[0], "r"))) {
|
||||||
weprintf("fopen %s:", argv[0]);
|
weprintf("fopen %s:", argv[0]);
|
||||||
|
@ -57,57 +106,3 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
fold(FILE *fp, long width)
|
|
||||||
{
|
|
||||||
char *buf = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
|
|
||||||
while (getline(&buf, &size, fp) != -1)
|
|
||||||
foldline(buf, width);
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
foldline(const char *str, long width)
|
|
||||||
{
|
|
||||||
int space;
|
|
||||||
long col, j;
|
|
||||||
size_t i = 0, n = 0;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
do {
|
|
||||||
space = 0;
|
|
||||||
for (j = i, col = 0; str[j] && col <= width; j++) {
|
|
||||||
c = str[j];
|
|
||||||
if (!UTF8_POINT(c) && !bflag)
|
|
||||||
continue;
|
|
||||||
if (sflag && isspace(c)) {
|
|
||||||
space = 1;
|
|
||||||
n = j+1;
|
|
||||||
}
|
|
||||||
else if (!space)
|
|
||||||
n = j;
|
|
||||||
|
|
||||||
if (!bflag && iscntrl(c))
|
|
||||||
switch(c) {
|
|
||||||
case '\b':
|
|
||||||
col--;
|
|
||||||
break;
|
|
||||||
case '\r':
|
|
||||||
col = 0;
|
|
||||||
break;
|
|
||||||
case '\t':
|
|
||||||
col += (col+1) % 8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
col++;
|
|
||||||
}
|
|
||||||
if (fwrite(&str[i], 1, n-i, stdout) != n-i)
|
|
||||||
eprintf("<stdout>: write error:");
|
|
||||||
if (str[n])
|
|
||||||
putchar('\n');
|
|
||||||
} while (str[i = n] && str[i] != '\n');
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user