put display save area back into formal routine structure
[unix-history] / usr / src / usr.bin / pascal / pix / pix.c
CommitLineData
2d40c995
KM
1/* Copyright (c) 1979 Regents of the University of California */
2
3static char sccsid[] = "@(#)pix.c 1.2 %G%";
4
134fe9f6
BJ
5/*
6 * pix - pi then px
7 *
8 * Bill Joy UCB August 26, 1977
9 */
134fe9f6 10
2d40c995
KM
11#include "whoami.h"
12#include "objfmt.h"
134fe9f6
BJ
13#define ERRS 1
14
15char *name;
16
17int onintr();
18
19#define ETXTBSY 26
20
21main(argc, argv)
22 int argc;
23 char *argv[];
24{
25 register char **av;
26 register int ac;
27 int i, io, pid, status;
28 extern errno;
29
30 do
31 io = open("/dev/null", 0);
32 while (io >= 0 && io < 3);
33 for (io = 3; io < 15; io++)
34 close(io);
35 if ((signal(2, 1) & 01) == 0)
36 signal(2, onintr);
37 for (ac = 1; ac < argc; ac++)
38 if (dotted(argv[ac], 'p')) {
39 ac++;
40 break;
41 }
42 name = "-o/tmp/pixaXXXXX" + 2;
43 mktemp(name);
44 for (;;) {
45 io = creat(name, 0400);
46 if (io > 0)
47 break;
48 if (name[8] == 'z') {
49 perror(name);
50 exit(1);
51 }
52 name[8]++;
53 }
54 pid = fork();
55 if (pid == -1) {
56 write(2, "No more processes\n", 18);
57 onintr();
58 }
59 if (pid == 0) {
60 if (io != 3) {
61 write(2, "Impossible error in pix\n", 24);
62 onintr();
63 }
64 argv[ac] = 0;
65 argv[0] = name - 2;
134fe9f6 66 do
2d40c995 67 execv(PI_COMP, argv);
134fe9f6
BJ
68 while (errno == ETXTBSY);
69 write(2, "Can't find pi\n", 14);
70 onintr();
71 }
72 close(io);
73 do
74 i = wait(&status);
75 while (i != pid && i != -1);
76 if (i == -1 || (status & 0377))
77 onintr();
78 if (status != 0) {
79 if ((status >> 8) == ERRS)
80 write(2, "Execution suppressed due to compilation errors\n", 47);
81 onintr();
82 }
83 ac--;
84 argv[ac] = name - 2;
85 argv[argc] = 0;
134fe9f6 86 do
2d40c995 87 execv(PX_INTRP, &argv[ac]);
134fe9f6
BJ
88 while (errno == ETXTBSY);
89 write(2, "Can't find px\n", 14);
90 onintr();
91}
92
93dotted(cp, ch)
94 char *cp, ch;
95{
96 register int i;
97
98 i = strlen(cp);
99 return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch);
100}
101
102onintr()
103{
104
105 signal(2, 1);
106 unlink(name);
107 exit(1);
108}