BSD 4 release
[unix-history] / usr / src / cmd / px / utilities.c
CommitLineData
8c536409
KM
1/* Copyright (c) 1979 Regents of the University of California */
2
31cef89c 3static 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 */
13char *palloc(need)
14
15long need;
16
17{
18extern char *malloc();
19register char *memblk, *ptr;
20
21memblk = malloc(need);
22if (memblk == 0)
23 error(EOUTOFMEM);
24if (memblk == (char *)(-1))
25 error(ETRASHHEAP);
26for(ptr=memblk; ptr<memblk+need; ptr++)
27 *ptr = 0;
28return(memblk);
29}
30
31
32
33/*
34 * Free a block of storage on the stack
35 */
36pfree(ptr)
37
38char *ptr;
39
40{
41extern long free();
42
43if (ptr == 0)
44 error(ENILPTR);
45else if (free(ptr) == -1)
46 error(ETRASHHEAP);
47}
48\f
8c536409
KM
49long _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
64long *
31cef89c 65cttot(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
134inct(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
162char pd_date[] = {
163 8, 9, 10, 4, 5, 6, 10, 22, 23, 10, 0
164};
165
166char *ctime();
167
168pdattim(op, alfap)
169register 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
184psexit(code)
185
186long code;
187{
188
189pmflush();
31cef89c 190if (mode == PIX) {
a96faa1f
CH
191 fputs("Execution terminated",stderr);
192 if (code)
193 fputs(" abnormally",stderr);
194 fputc('.',stderr);
195 fputc('\n',stderr);
196 }
197stats();
198exit(code);
199}