Bell 32V development
[unix-history] / usr / src / cmd / sp.c
CommitLineData
3b600ead
TL
1/*
2 * Print horizontally as possible, thus saving paper
3 */
4#include <stdio.h>
5int tab[8] = {8,7,6,5,4,3,2,1};
6int next; /*next output position on line*/
7int slen; /*length at start of line*/
8int alen; /*actual length*/
9int elen; /*length on current line*/
10char buf[256];
11getit()
12{ register int i;
13 register c;
14 slen=alen=elen=0;
15 for(i=0;;i++)
16 { buf[i]=c=getchar();
17 switch(c)
18 {
19 case '\n': if(i==0) continue;
20 case EOF:
21 alen=i;
22 return(i);
23 case '\t':
24 elen+= tab[(next+elen)%8];
25 slen += tab[slen%8];
26 continue;
27 default:
28 elen++;
29 slen++;
30 continue;
31 }
32 }
33}
34putit(ntab)
35{ register int i;
36 for(i=0;i<ntab;i++) putchar('\t');
37 for(i=0;i<alen;i++) putchar(buf[i]);
38}
39clean()
40{
41 putchar('\n');
42}
43main(argc,argv) char *argv[];
44{ int len,ntab;
45 int i;
46 len=80;
47 if(argc>1)
48 { i=atoi(argv[1]);
49 if(i<0) i= -i;
50 len=(i<1?1:i);
51 }
52 else len=80;
53 for(;;)
54 { if(next==0) ntab=0;
55 else if(tab[next%8]<1)
56 { ntab=2;
57 next+= tab[next%8];
58 next += tab[next%8];
59 }
60 else
61 { ntab=1;
62 next += tab[next%8];
63 }
64 if(getit()<=0) {clean(); exit(0);}
65 if(elen+next>=len)
66 { clean();
67 next=slen;
68 putit(0);
69 }
70 else
71 { next += elen;
72 putit(ntab);
73 }
74 }
75}