BSD 3 development
[unix-history] / .ref-BSD-2 / src / fold.c
CommitLineData
ffcdbf5b
BJ
1/* Copyright (c) 1979 Regents of the University of California */
2#include <retrofit.h>
3#include <stdio.h>
4/*
5 * fold - fold long lines for finite output devices
6 *
7 * Bill Joy UCB June 28, 1977
8 */
9
10int fold = 80;
11
12main(argc, argv)
13 int argc;
14 char *argv[];
15{
16 register c;
17 FILE *f;
18 char obuf[BUFSIZ];
19
20 argc--, argv++;
21 setbuf(stdout, obuf);
22 if (argc > 0 && argv[0][0] == '-') {
23 fold = 0;
24 argv[0]++;
25 while (*argv[0] >= '0' && *argv[0] <= '9')
26 fold =* 10, fold =+ *argv[0]++ - '0';
27 if (*argv[0]) {
28 printf("Bad number for fold\n");
29 exit(1);
30 }
31 argc--, argv++;
32 }
33 do {
34 if (argc > 0) {
35 if (freopen(argv[0], "r", stdin) == NULL) {
36 perror(argv[0]);
37 exit(1);
38 }
39 argc--, argv++;
40 }
41 for (;;) {
42 c = getc(stdin);
43 if (c == -1)
44 break;
45 putch(c);
46 }
47 } while (argc > 0);
48 exit(0);
49}
50
51int col;
52
53putch(c)
54 register c;
55{
56 register ncol;
57
58 switch (c) {
59 case '\n':
60 ncol = 0;
61 break;
62 case '\t':
63 ncol = (col + 8) &~ 7;
64 break;
65 case '\b':
66 ncol = col ? col - 1 : 0;
67 break;
68 case '\r':
69 ncol = 0;
70 break;
71 default:
72 ncol = col + 1;
73 }
74 if (ncol > fold)
75 putchar('\n'), col = 0;
76 putchar(c);
77 switch (c) {
78 case '\n':
79 col = 0;
80 break;
81 case '\t':
82 col =+ 8;
83 col =& ~7;
84 break;
85 case '\b':
86 if (col)
87 col--;
88 break;
89 case '\r':
90 col = 0;
91 break;
92 default:
93 col++;
94 break;
95 }
96}