better code for set operations
[unix-history] / usr / src / usr.bin / pascal / pix / pix.c
CommitLineData
252367af
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8char copyright[] =
9"@(#) Copyright (c) 1980 Regents of the University of California.\n\
10 All rights reserved.\n";
11#endif not lint
2d40c995 12
252367af
DF
13#ifndef lint
14static char sccsid[] = "@(#)pix.c 5.1 (Berkeley) %G%";
15#endif not lint
2d40c995 16
134fe9f6
BJ
17/*
18 * pix - pi then px
19 *
20 * Bill Joy UCB August 26, 1977
21 */
134fe9f6 22
2d40c995
KM
23#include "whoami.h"
24#include "objfmt.h"
aa6c84c4 25#include "config.h"
134fe9f6
BJ
26#define ERRS 1
27
28char *name;
29
30int onintr();
31
32#define ETXTBSY 26
33
34main(argc, argv)
35 int argc;
36 char *argv[];
37{
38 register char **av;
39 register int ac;
40 int i, io, pid, status;
41 extern errno;
42
43 do
44 io = open("/dev/null", 0);
45 while (io >= 0 && io < 3);
46 for (io = 3; io < 15; io++)
47 close(io);
48 if ((signal(2, 1) & 01) == 0)
49 signal(2, onintr);
50 for (ac = 1; ac < argc; ac++)
51 if (dotted(argv[ac], 'p')) {
52 ac++;
53 break;
54 }
55 name = "-o/tmp/pixaXXXXX" + 2;
56 mktemp(name);
57 for (;;) {
58 io = creat(name, 0400);
59 if (io > 0)
60 break;
61 if (name[8] == 'z') {
62 perror(name);
63 exit(1);
64 }
65 name[8]++;
66 }
67 pid = fork();
68 if (pid == -1) {
69 write(2, "No more processes\n", 18);
70 onintr();
71 }
72 if (pid == 0) {
73 if (io != 3) {
74 write(2, "Impossible error in pix\n", 24);
75 onintr();
76 }
77 argv[ac] = 0;
78 argv[0] = name - 2;
134fe9f6 79 do
aa6c84c4 80 execv(pi_comp, argv);
134fe9f6
BJ
81 while (errno == ETXTBSY);
82 write(2, "Can't find pi\n", 14);
83 onintr();
84 }
85 close(io);
86 do
87 i = wait(&status);
88 while (i != pid && i != -1);
89 if (i == -1 || (status & 0377))
90 onintr();
91 if (status != 0) {
92 if ((status >> 8) == ERRS)
93 write(2, "Execution suppressed due to compilation errors\n", 47);
94 onintr();
95 }
96 ac--;
b2877e66
KM
97 argv[ac] = name;
98 ac--;
99 argv[ac] = "pix";
134fe9f6 100 argv[argc] = 0;
134fe9f6 101 do
aa6c84c4 102 execv(px_debug, &argv[ac]);
134fe9f6
BJ
103 while (errno == ETXTBSY);
104 write(2, "Can't find px\n", 14);
105 onintr();
106}
107
108dotted(cp, ch)
109 char *cp, ch;
110{
111 register int i;
112
113 i = strlen(cp);
114 return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch);
115}
116
117onintr()
118{
119
120 signal(2, 1);
121 unlink(name);
122 exit(1);
123}