home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s2 / ptx.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  3.2 KB  |  223 lines

  1. /* permuted title index */
  2.  
  3. char    *tfil "/tmp/p.tmp";
  4. char    *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};
  18. char    line[200];
  19. int    ch;
  20. int    ptflg;
  21. int    llen    72;
  22.  
  23. main(argc, argv)
  24. int argc;
  25. char *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.  
  91. onintr()
  92. {
  93.     unlink(tfil);
  94.     exit();
  95. }
  96.  
  97. pass1()
  98. {
  99.     int n, c, i, ll, j, k, cc, ccc;
  100.  
  101. loop:
  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;
  124. l1:
  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.  
  152. pass2()
  153. {
  154.     int i, n, c, tilde, llen2, nbfore, nafter;
  155.  
  156.  
  157.     llen2 = llen/2+6;
  158. loop:
  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.     }
  193. l1:
  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.  
  214. p1char(c)
  215. {
  216.     if ((c&0377) == 0200) {
  217.         putchar('.');
  218.         putchar('.');
  219.         c = '.';
  220.     }
  221.     putchar(c);
  222. }
  223.