|
|
1.1 root 1: /*-
2: * Copyright (c) 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Kevin Ruddy.
7: *
8: * Redistribution and use in source and binary forms are permitted
9: * provided that: (1) source distributions retain this entire copyright
10: * notice and comment, and (2) distributions including binaries display
11: * the following acknowledgement: ``This product includes software
12: * developed by the University of California, Berkeley and its contributors''
13: * in the documentation or other materials provided with the distribution
14: * and in all advertising materials mentioning features or use of this
15: * software. Neither the name of the University nor the names of its
16: * contributors may be used to endorse or promote products derived
17: * from this software without specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: char copyright[] =
25: "@(#) Copyright (c) 1990 The Regents of the University of California.\n\
26: All rights reserved.\n";
27: #endif /* not lint */
28:
29: #ifndef lint
30: static char sccsid[] = "@(#)fold.c 5.5 (Berkeley) 6/1/90";
31: #endif /* not lint */
32:
33: #include <stdio.h>
34: #include <string.h>
35:
36: #define DEFLINEWIDTH 80
37:
38: main(argc, argv)
39: int argc;
40: char **argv;
41: {
42: extern int errno, optind;
43: extern char *optarg;
44: register int ch;
45: int width;
46: char *p;
47:
48: width = -1;
49: while ((ch = getopt(argc, argv, "0123456789w:")) != EOF)
50: switch (ch) {
51: case 'w':
52: if ((width = atoi(optarg)) <= 0) {
53: (void)fprintf(stderr,
54: "fold: illegal width value.\n");
55: exit(1);
56: }
57: break;
58: case '0': case '1': case '2': case '3': case '4':
59: case '5': case '6': case '7': case '8': case '9':
60: if (width == -1) {
61: p = argv[optind - 1];
62: if (p[0] == '-' && p[1] == ch && !p[2])
63: width = atoi(++p);
64: else
65: width = atoi(argv[optind] + 1);
66: }
67: break;
68: default:
69: (void)fprintf(stderr,
70: "usage: fold [-w width] [file ...]\n");
71: exit(1);
72: }
73: argv += optind;
74: argc -= optind;
75:
76: if (width == -1)
77: width = DEFLINEWIDTH;
78: if (!*argv)
79: fold(width);
80: else for (; *argv; ++argv)
81: if (!freopen(*argv, "r", stdin)) {
82: (void)fprintf(stderr,
83: "fold: %s: %s\n", *argv, strerror(errno));
84: exit(1);
85: } else
86: fold(width);
87: exit(0);
88: }
89:
90: fold(width)
91: register int width;
92: {
93: register int ch, col, new;
94:
95: for (col = 0;;) {
96: switch (ch = getchar()) {
97: case EOF:
98: return;
99: case '\b':
100: new = col ? col - 1 : 0;
101: break;
102: case '\n':
103: case '\r':
104: new = 0;
105: break;
106: case '\t':
107: new = (col + 8) & ~7;
108: break;
109: default:
110: new = col + 1;
111: break;
112: }
113:
114: if (new > width) {
115: putchar('\n');
116: col = 0;
117: }
118: putchar(ch);
119:
120: switch (ch) {
121: case '\b':
122: if (col > 0)
123: --col;
124: break;
125: case '\n':
126: case '\r':
127: col = 0;
128: break;
129: case '\t':
130: col += 8;
131: col &= ~7;
132: break;
133: default:
134: ++col;
135: break;
136: }
137: }
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.