Commit | Line | Data |
---|---|---|
3b600ead TL |
1 | /* |
2 | * Print horizontally as possible, thus saving paper | |
3 | */ | |
4 | #include <stdio.h> | |
5 | int tab[8] = {8,7,6,5,4,3,2,1}; | |
6 | int next; /*next output position on line*/ | |
7 | int slen; /*length at start of line*/ | |
8 | int alen; /*actual length*/ | |
9 | int elen; /*length on current line*/ | |
10 | char buf[256]; | |
11 | getit() | |
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 | } | |
34 | putit(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 | } | |
39 | clean() | |
40 | { | |
41 | putchar('\n'); | |
42 | } | |
43 | main(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 | } |