|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)utilities.c 4.2 10/20/80";
4:
5: #include "stdio.h"
6: #include "h00vars.h"
7: #include "h01errs.h"
8: #include "h02opcs.h"
9:
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:
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 *
65: cttot(result, lowerbnd, upperbnd, paircnt, singcnt, data)
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++) {
91: lower = *dataptr++ - lowerbnd;
92: if (lower < 0 || lower > upperbnd) {
93: error(ECTLWR);
94: return;
95: }
96: upper = *dataptr++ - lowerbnd;
97: if (upper < 0 || upper > upperbnd) {
98: error(ECTUPR);
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) {
124: error(ECTSNG);
125: return;
126: }
127: lowerdiv = lower / BITSPERLONG;
128: lowermod = lower % BITSPERLONG;
129: result[ lowerdiv ] |= ( 1 << lowermod );
130: }
131: return(result);
132: }
133:
134: inct(element, paircnt, singcnt, data)
135:
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 */
140: {
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;
157: }
158: }
159: return FALSE;
160: }
161:
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:
184: psexit(code)
185:
186: long code;
187: {
188:
189: pmflush();
190: if (mode == PIX) {
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.