Commit | Line | Data |
---|---|---|
8c536409 KM |
1 | /* Copyright (c) 1979 Regents of the University of California */ |
2 | ||
31cef89c | 3 | static char sccsid[] = "@(#)utilities.c 4.2 10/20/80"; |
8c536409 | 4 | |
a96faa1f CH |
5 | #include "stdio.h" |
6 | #include "h00vars.h" | |
7 | #include "h01errs.h" | |
8 | #include "h02opcs.h" | |
8c536409 | 9 | |
a96faa1f CH |
10 | /* |
11 | * allocate a block of storage on the heap | |
12 | */ | |
13 | char *palloc(need) | |
14 | ||
15 | long need; | |
16 | ||
17 | { | |
18 | extern char *malloc(); | |
19 | register char *memblk, *ptr; | |
20 | ||
21 | memblk = malloc(need); | |
22 | if (memblk == 0) | |
23 | error(EOUTOFMEM); | |
24 | if (memblk == (char *)(-1)) | |
25 | error(ETRASHHEAP); | |
26 | for(ptr=memblk; ptr<memblk+need; ptr++) | |
27 | *ptr = 0; | |
28 | return(memblk); | |
29 | } | |
30 | ||
31 | ||
32 | ||
33 | /* | |
34 | * Free a block of storage on the stack | |
35 | */ | |
36 | pfree(ptr) | |
37 | ||
38 | char *ptr; | |
39 | ||
40 | { | |
41 | extern long free(); | |
42 | ||
43 | if (ptr == 0) | |
44 | error(ENILPTR); | |
45 | else if (free(ptr) == -1) | |
46 | error(ETRASHHEAP); | |
47 | } | |
48 | \f | |
8c536409 KM |
49 | long _mask[] = { |
50 | 0xffffffff , 0xfffffffe , 0xfffffffc , 0xfffffff8 , | |
51 | 0xfffffff0 , 0xffffffe0 , 0xffffffc0 , 0xffffff80 , | |
52 | 0xffffff00 , 0xfffffe00 , 0xfffffc00 , 0xfffff800 , | |
53 | 0xfffff000 , 0xffffe000 , 0xffffc000 , 0xffff8000 , | |
54 | 0xffff0000 , 0xfffe0000 , 0xfffc0000 , 0xfff80000 , | |
55 | 0xfff00000 , 0xffe00000 , 0xffc00000 , 0xff800000 , | |
56 | 0xff000000 , 0xfe000000 , 0xfc000000 , 0xf8000000 , | |
57 | 0xf0000000 , 0xe0000000 , 0xc0000000 , 0x80000000 , | |
58 | 0x00000000 | |
59 | }; | |
60 | /* | |
61 | * Constant set constructor | |
62 | */ | |
63 | ||
64 | long * | |
31cef89c | 65 | cttot(result, lowerbnd, upperbnd, paircnt, singcnt, data) |
8c536409 KM |
66 | |
67 | long *result; /* pointer to final set */ | |
68 | int lowerbnd; /* lower bound of set */ | |
69 | int upperbnd; /* upper - lower of set */ | |
70 | int paircnt; /* number of pairs to construct */ | |
71 | int singcnt; /* number of singles to construct */ | |
72 | int data; /* paircnt plus singcnt sets of data */ | |
73 | { | |
74 | register int lower; | |
75 | register int lowerdiv; | |
76 | register int lowermod; | |
77 | register int upper; | |
78 | int upperdiv; | |
79 | int uppermod; | |
80 | register int *dataptr; | |
81 | register long *lp; | |
82 | long *limit; | |
83 | long temp; | |
84 | long cnt; | |
85 | ||
86 | limit = &result[(upperbnd + 1 + BITSPERLONG - 1) / BITSPERLONG]; | |
87 | for (lp = result; lp < limit; ) | |
88 | *lp++ = 0; | |
89 | dataptr = &data; | |
90 | for (cnt = 0; cnt < paircnt; cnt++) { | |
8c536409 KM |
91 | lower = *dataptr++ - lowerbnd; |
92 | if (lower < 0 || lower > upperbnd) { | |
31cef89c BJ |
93 | error(ECTLWR); |
94 | return; | |
95 | } | |
96 | upper = *dataptr++ - lowerbnd; | |
97 | if (upper < 0 || upper > upperbnd) { | |
98 | error(ECTUPR); | |
8c536409 KM |
99 | return; |
100 | } | |
101 | if (lower > upper) { | |
102 | continue; | |
103 | } | |
104 | lowerdiv = lower / BITSPERLONG; | |
105 | lowermod = lower % BITSPERLONG; | |
106 | upperdiv = upper / BITSPERLONG; | |
107 | uppermod = upper % BITSPERLONG; | |
108 | temp = _mask [lowermod]; | |
109 | if ( lowerdiv == upperdiv ) { | |
110 | temp &= ~_mask[ uppermod + 1 ]; | |
111 | } | |
112 | result[ lowerdiv ] |= temp; | |
113 | limit = &result[ upperdiv-1 ]; | |
114 | for ( lp = &result[ lowerdiv+1 ] ; lp <= limit ; lp++ ) { | |
115 | *lp |= ~0; | |
116 | } | |
117 | if ( lowerdiv != upperdiv ) { | |
118 | result[ upperdiv ] |= ~_mask[ uppermod + 1 ]; | |
119 | } | |
120 | } | |
121 | for (cnt = 0; cnt < singcnt; cnt++) { | |
122 | lower = *dataptr++ - lowerbnd; | |
123 | if (lower < 0 || lower > upperbnd) { | |
31cef89c | 124 | error(ECTSNG); |
8c536409 KM |
125 | return; |
126 | } | |
127 | lowerdiv = lower / BITSPERLONG; | |
128 | lowermod = lower % BITSPERLONG; | |
129 | result[ lowerdiv ] |= ( 1 << lowermod ); | |
130 | } | |
131 | return(result); | |
132 | } | |
31cef89c BJ |
133 | \f |
134 | inct(element, paircnt, singcnt, data) | |
a96faa1f | 135 | |
31cef89c BJ |
136 | register int element; /* element to find */ |
137 | int paircnt; /* number of pairs to check */ | |
138 | int singcnt; /* number of singles to check */ | |
139 | int data; /* paircnt plus singcnt bounds */ | |
a96faa1f | 140 | { |
31cef89c BJ |
141 | register int *dataptr; |
142 | register int cnt; | |
143 | ||
144 | dataptr = &data; | |
145 | for (cnt = 0; cnt < paircnt; cnt++) { | |
146 | if (element < *dataptr++) { | |
147 | dataptr++; | |
148 | continue; | |
149 | } | |
150 | if (element <= *dataptr++) { | |
151 | return TRUE; | |
152 | } | |
153 | } | |
154 | for (cnt = 0; cnt < singcnt; cnt++) { | |
155 | if (element == *dataptr++) { | |
156 | return TRUE; | |
a96faa1f CH |
157 | } |
158 | } | |
31cef89c | 159 | return FALSE; |
a96faa1f CH |
160 | } |
161 | \f | |
162 | char pd_date[] = { | |
163 | 8, 9, 10, 4, 5, 6, 10, 22, 23, 10, 0 | |
164 | }; | |
165 | ||
166 | char *ctime(); | |
167 | ||
168 | pdattim(op, alfap) | |
169 | register char *alfap; | |
170 | { | |
171 | register char *ap, *cp, *dp; | |
172 | long a; | |
173 | int i; | |
174 | ||
175 | time(&a); | |
176 | cp = ctime(&a); | |
177 | ap = alfap; | |
178 | if (op == O_DATE) | |
179 | for (dp = pd_date; *dp; *ap++ = cp[*dp++]); | |
180 | else | |
181 | for (cp = cp + 10, i = 10; i; *ap++ = *cp++, i--); | |
182 | } | |
183 | \f | |
184 | psexit(code) | |
185 | ||
186 | long code; | |
187 | { | |
188 | ||
189 | pmflush(); | |
31cef89c | 190 | if (mode == PIX) { |
a96faa1f CH |
191 | fputs("Execution terminated",stderr); |
192 | if (code) | |
193 | fputs(" abnormally",stderr); | |
194 | fputc('.',stderr); | |
195 | fputc('\n',stderr); | |
196 | } | |
197 | stats(); | |
198 | exit(code); | |
199 | } |