add directory study
This commit is contained in:
117
study/linux-travel/MINIX-1.5/1.5/Source/commands/width.c
Normal file
117
study/linux-travel/MINIX-1.5/1.5/Source/commands/width.c
Normal file
@@ -0,0 +1,117 @@
|
||||
/* width - force a file to a fixed width Author: Andy Tanenbaum */
|
||||
|
||||
/* This program reads an input file (by default, stdin), and forces each
|
||||
* line to a certain length (by default 80 columns). Lines that are
|
||||
* shorter than this are padded with spaces. Lines that are longer are
|
||||
* truncated. Tabs are expanded to spaces in the output.
|
||||
*
|
||||
* Examples: width x y # copy x to y and make all lines 80 cols
|
||||
* width x # copy x to stdout and force all lines to 80
|
||||
* width -40 x # copy x to stdout and force to 40 cols
|
||||
* width -30 x y # copy x to y and force to 30 cols
|
||||
* width -20 # copy stdin to stdout and force to 20 cols
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define MAX_WIDTH 1024 /* longest acceptable line */
|
||||
#define TAB_WIDTH 8 /* spacing between tab stops */
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
|
||||
int width, k;
|
||||
char *p;
|
||||
FILE *in, *out;
|
||||
|
||||
/* Process command line. */
|
||||
p = argv[1];
|
||||
k = 1;
|
||||
width = 80;
|
||||
if (argc > 1 && *p == '-') {
|
||||
width = atoi(p + 1);
|
||||
if (width < 1 || width > MAX_WIDTH) usage(argv[0]);
|
||||
k = 2;
|
||||
}
|
||||
if (argc == k) {
|
||||
/* No file arguments. */
|
||||
process(stdin, stdout, width);
|
||||
} else if (argc == k + 1) {
|
||||
/* For example: width file or width -30 file */
|
||||
if ((in = fopen(argv[k], "r")) == (FILE *) NULL)
|
||||
cant_open(argv[0], argv[k]);
|
||||
process(in, stdout, width);
|
||||
} else if (argc == k + 2) {
|
||||
/* For example, width inf outf or width -30 inf outf */
|
||||
if ((in = fopen(argv[k], "r")) == (FILE *) NULL)
|
||||
cant_open(argv[0], argv[k]);
|
||||
if ((out = fopen(argv[k + 1], "w")) == (FILE *) NULL)
|
||||
cant_open(argv[0], argv[k]);
|
||||
process(in, out, width);
|
||||
} else {
|
||||
usage(argv[0]);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
process(in, out, width)
|
||||
FILE *in, *out;
|
||||
int width;
|
||||
{
|
||||
/* Copy in to out and force all the lines to width. */
|
||||
|
||||
int col, spaces;
|
||||
register char *p, *q;
|
||||
char in_buf[MAX_WIDTH + 1], out_buf[MAX_WIDTH + 1];
|
||||
|
||||
while (fgets(in_buf, MAX_WIDTH, in) != (char *) NULL) {
|
||||
/* This loop executed once for each line in the input file. */
|
||||
p = in_buf;
|
||||
q = out_buf;
|
||||
col = 0;
|
||||
while (*p != 0) {
|
||||
/* This loop executed once for each character in the line. */
|
||||
if (*p != '\t') {
|
||||
/* Not a tab. */
|
||||
*q++ = *p++;
|
||||
col++;
|
||||
} else {
|
||||
/* Tab. */
|
||||
spaces = TAB_WIDTH - (col % TAB_WIDTH);
|
||||
col += spaces;
|
||||
while (spaces--) *q++ = ' ';
|
||||
p++;
|
||||
}
|
||||
}
|
||||
if (*(q - 1) == '\n') *(q - 1) = ' ';
|
||||
while (q < &out_buf[width]) *q++ = ' ';
|
||||
out_buf[width] = '\n';
|
||||
out_buf[width + 1] = 0;
|
||||
fputs(out_buf, out);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
cant_open(program, file)
|
||||
char *program;
|
||||
char *file;
|
||||
{
|
||||
fputs(program, stderr);
|
||||
fputs(": cannot open ", stderr);
|
||||
fputs(file, stderr);
|
||||
putc('\n', stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
usage(s)
|
||||
char *s;
|
||||
{
|
||||
fputs("Usage: ", stderr);
|
||||
fputs(s, stderr);
|
||||
fputs(" [-<width>] [infile [outfile] ]\n", stderr);
|
||||
exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user