223 lines
3.2 KiB
C
223 lines
3.2 KiB
C
/* permuted title index */
|
|
|
|
char *tfil "/tmp/p.tmp";
|
|
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(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", "-d", "-o", tfil, tfil, 0);
|
|
execl("/usr/bin/sort", "sort", "-d", "-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);
|
|
}
|