Research V6 development
[unix-history] / usr / source / s2 / ptx.c
CommitLineData
a299af2c
KT
1/* permuted title index */
2
3char *tfil "/tmp/p.tmp";
4char *sw[] {
5 "a",
6 "an",
7 "and",
8 "as",
9 "for",
10 "is",
11 "of",
12 "on",
13 "or",
14 "the",
15 "to",
16 "up",
17 0};
18char line[200];
19int ch;
20int ptflg;
21int llen 72;
22
23main(argc, argv)
24int argc;
25char *argv[];
26{
27 extern fin, fout;
28 extern onintr();
29 int f;
30
31 if(argc>1 && *argv[1]=='-') {
32 llen = 100;
33 ptflg++;
34 argc--;
35 argv++;
36 }
37 if(argc<2) {
38 printf("arg count\n");
39 exit();
40 }
41 fin = open(argv[1]);
42 if(fin < 0) {
43 printf("%s: cannot open\n", argv[1]);
44 exit();
45 }
46 f = creat(tfil, 0600);
47 if(f < 0) {
48 printf("cannot create %s\n", tfil);
49 exit();
50 }
51 fout = f;
52 if ((signal(2, 1) & 01) ==0)
53 signal(2, onintr);
54 pass1();
55 flush();
56 close(fin);
57 fin = 0;
58 close(fout);
59 fout = 1;
60 f = fork();
61 if(f < 0) {
62 printf("try again\n");
63 exit();
64 }
65 if(f == 0) {
66 execl("/bin/sort", "sort", "-d", "-o", tfil, tfil, 0);
67 execl("/usr/bin/sort", "sort", "-d", "-o", tfil, tfil, 0);
68 printf("someone moved sort\n");
69 exit();
70 }
71 while(wait() != f);
72 fin = open(tfil, 0);
73 if(fin < 0) {
74 printf("cannot reopen %s\n", tfil);
75 exit();
76 }
77 if (argc>=3)
78 f = creat(argv[2], 0666);
79 else
80 f = dup(1);
81 if(f < 0) {
82 printf("%s: cannot open\n", argv[2]);
83 exit();
84 }
85 fout = f;
86 pass2();
87 flush();
88 onintr();
89}
90
91onintr()
92{
93 unlink(tfil);
94 exit();
95}
96
97pass1()
98{
99 int n, c, i, ll, j, k, cc, ccc;
100
101loop:
102 if ((c=getchar())=='\0')
103 return;
104 n = 0;
105 i = 0;
106 while(c!='\n' && c!='\0') {
107 if(c == '(')
108 c = 0177;
109 if(c==' ' || c=='\t') {
110 i++;
111 c = getchar();
112 continue;
113 }
114 if(i) {
115 i = 0;
116 if(n<=llen) line[n++] = ' ';
117 }
118 if (n<=llen) line[n++] = c;
119 c = getchar();
120 }
121 ll = n;
122 line[n++] = 0;
123 i = -1;
124l1:
125 while((cc=line[++i])==' ');
126 n = i;
127 j = 0;
128 while(sw[j]) {
129 i = n;
130 k = 0;
131 while ((cc=sw[j][k++])==line[i++]);
132 if(cc==0 && ((ccc=line[--i])==' '||ccc==0))
133 goto l1;
134 j++;
135 }
136 i = n;
137 while (c=line[n++]) putchar(c);
138 putchar('~');
139 n = 0;
140 while (n<i) {
141 c = line[n++];
142 if (c!=' ' || n!=i)
143 putchar(c);
144 }
145 putchar('\n');
146 while((c=line[i++])!=0 && c!=' ');
147 --i;
148 if (c) goto l1;
149 goto loop;
150}
151
152pass2()
153{
154 int i, n, c, tilde, llen2, nbfore, nafter;
155
156
157 llen2 = llen/2+6;
158loop:
159 if ((c=getchar())=='\0')
160 return;
161 n = nbfore = nafter = 0;
162 tilde = -1;
163 while(c!='\n' && c!='\0') {
164 if(c == 0177)
165 c = '(';
166 if (n<=llen) line[n] = c;
167 if (c=='~') tilde = n;
168 if (tilde>=0) nafter++; else nbfore++;
169 n++;
170 c = getchar();
171 }
172 if (tilde<0)
173 tilde = n++;
174 nafter--;
175 if (nbfore>llen2) {
176 i = tilde;
177 while (nbfore > llen2)
178 while(line[--i]!=' ' && i>=0) nbfore--;
179 if (i<0) goto l1;
180 line[tilde] = 0200;
181 nafter =+ (tilde-i+2);
182 tilde = i;
183 }
184 if (nafter >= llen-llen2) {
185 i = tilde;
186 while(nafter-- >= llen-llen2)
187 while(line[++i]!=' ' && i<n) nafter--;
188 if (i>=n) goto l1;
189 line[tilde] = 0200;
190 nafter++;
191 tilde = i;
192 }
193l1:
194 if(!ptflg) {
195 for(i=llen-llen2-nafter; i>=8; i =- 8)
196 putchar('\t');
197 while(--i>=0)
198 putchar(' ');
199 } else
200 printf(".xx \"");
201 i = tilde;
202 while (++i<n) p1char(line[i]);
203 if(!ptflg)
204 printf(" "); else
205 printf("\" \"");
206 i = -1;
207 while(++i<tilde) p1char(line[i]);
208 if(ptflg)
209 putchar('"');
210 putchar('\n');
211 goto loop;
212}
213
214p1char(c)
215{
216 if ((c&0377) == 0200) {
217 putchar('.');
218 putchar('.');
219 c = '.';
220 }
221 putchar(c);
222}