/* permuted title index */ char *tfil "/tmp/p.tmpaXXXXXX"; char *sw[] { "a", "an", "and", "as", "for", "is", "of", "on", "or", "the", "to", "up", 0}; char line[200]; int ch; int ptflg; int llen 72; main(argc, argv) int argc; char *argv[]; { extern fin, fout; extern onintr(); int f; if(argc>1 && *argv[1]=='-') { llen = 100; ptflg++; argc--; argv++; } if(argc<2) { printf("arg count\n"); exit(); } fin = open(argv[1]); if(fin < 0) { printf("%s: cannot open\n", argv[1]); exit(); } f = creat(mktemp(tfil), 0600); if(f < 0) { printf("cannot create %s\n", tfil); exit(); } fout = f; if ((signal(2, 1) & 01) ==0) signal(2, onintr); pass1(); flush(); close(fin); fin = 0; close(fout); fout = 1; f = fork(); if(f < 0) { printf("try again\n"); exit(); } if(f == 0) { execl("/bin/sort", "sort", "-dfi", "-o", tfil, tfil, 0); printf("someone moved sort\n"); exit(); } while(wait() != f); fin = open(tfil, 0); if(fin < 0) { printf("cannot reopen %s\n", tfil); exit(); } if (argc>=3) f = creat(argv[2], 0666); else f = dup(1); if(f < 0) { printf("%s: cannot open\n", argv[2]); exit(); } fout = f; pass2(); flush(); onintr(); } onintr() { unlink(tfil); exit(); } pass1() { int n, c, i, ll, j, k, cc, ccc; loop: if ((c=getchar())=='\0') return; n = 0; i = 0; while(c!='\n' && c!='\0') { if(c == '(') c = 0177; if(c==' ' || c=='\t') { i++; c = getchar(); continue; } if(i) { i = 0; if(n<=llen) line[n++] = ' '; } if (n<=llen) line[n++] = c; c = getchar(); } ll = n; line[n++] = 0; i = -1; l1: while((cc=line[++i])==' '); n = i; j = 0; while(sw[j]) { i = n; k = 0; while ((cc=sw[j][k++])==line[i++]); if(cc==0 && ((ccc=line[--i])==' '||ccc==0)) goto l1; j++; } i = n; while (c=line[n++]) putchar(c); putchar('~'); n = 0; while (n<i) { c = line[n++]; if (c!=' ' || n!=i) putchar(c); } putchar('\n'); while((c=line[i++])!=0 && c!=' '); --i; if (c) goto l1; goto loop; } pass2() { int i, n, c, tilde, llen2, nbfore, nafter; llen2 = llen/2+6; loop: if ((c=getchar())=='\0') return; n = nbfore = nafter = 0; tilde = -1; while(c!='\n' && c!='\0') { if(c == 0177) c = '('; if (n<=llen) line[n] = c; if (c=='~') tilde = n; if (tilde>=0) nafter++; else nbfore++; n++; c = getchar(); } if (tilde<0) tilde = n++; nafter--; if (nbfore>llen2) { i = tilde; while (nbfore > llen2) while(line[--i]!=' ' && i>=0) nbfore--; if (i<0) goto l1; line[tilde] = 0200; nafter =+ (tilde-i+2); tilde = i; } if (nafter >= llen-llen2) { i = tilde; while(nafter-- >= llen-llen2) while(line[++i]!=' ' && i<n) nafter--; if (i>=n) goto l1; line[tilde] = 0200; nafter++; tilde = i; } l1: if(!ptflg) { for(i=llen-llen2-nafter; i>=8; i =- 8) putchar('\t'); while(--i>=0) putchar(' '); } else printf(".xx \""); i = tilde; while (++i<n) p1char(line[i]); if(!ptflg) printf(" "); else printf("\" \""); i = -1; while(++i<tilde) p1char(line[i]); if(ptflg) putchar('"'); putchar('\n'); goto loop; } p1char(c) { if ((c&0377) == 0200) { putchar('.'); putchar('.'); c = '.'; } putchar(c); }