|
|
1.1 root 1: #include "cem.h"
2:
3: /*
4: * Allocate some memory.
5: */
6: char *
7: salloc(n)
8: long n;
9: {
10: register char *p;
11: extern char *malloc();
12:
13: if ((p = malloc((unsigned int)n)) == NULL)
14: {
15: fprintf(stderr, "%s: ran out of memory\n", my_name);
16: exit(1);
17: }
18:
19: return p;
20: }
21: /*
22: * Reallocate some memory.
23: */
24:
25: char *
26: srealloc(p, n)
27: register char *p;
28: long n;
29: {
30: extern char *realloc();
31:
32: if (p == NULL)
33: return salloc(n);
34: else if ((p = realloc(p, (unsigned int)n)) == NULL)
35: {
36: fprintf(stderr, "%s: ran out of memory\n", my_name);
37: exit(1);
38: }
39:
40: return p;
41: }
42:
43: /*
44: * Refill the alloc buffer.
45: */
46: char *
47: alloc_fill(want)
48: long want;
49: {
50: register long sz;
51:
52: if (want < ALLOC_SIZE)
53: sz = ALLOC_SIZE;
54: else
55: sz = want;
56:
57: alloc_ptr = salloc(sz);
58: alloc_end = alloc_ptr + sz;
59: alloc_ptr += want;
60: return alloc_ptr - want;
61: }
62:
63: /*
64: * Fetch 'u' datum.
65: *
66: * B0 = 11xxxxxx
67: *
68: * B0 5:0 sext to 31:24
69: * B1 7:0 as 23:16
70: * B2 7:0 as 15: 8
71: * B3 7:0 as 7: 0
72: *
73: * B0 = 10xxxxxx
74: *
75: * B0 5:0 sext to 31: 8
76: * B1 7:0 as 7: 0
77: *
78: * B0 = 0xxxxxxx
79: *
80: * B0 6:0 sext to 31: 0
81: */
82: long
83: getu()
84: {
85: register int i;
86: register long j;
87:
88: switch ((i = getd()) & 0xC0)
89: {
90: case 0xC0:
91: j = ((i & 0x3F) << 8) | (getd() & 0xFF);
92: j = (j << 8) | (getd() & 0xFF);
93: j = (j << 8) | (getd() & 0xFF);
94:
95: if ((i & 0x20) == 0)
96: return j;
97: else
98: return j | 0xC0000000L;
99:
100: case 0x80:
101: j = ((i & 0x3F) << 8) | (getd() & 0xFF);
102:
103: if ((i & 0x20) == 0)
104: return j;
105: else
106: return j | 0xFFFFC000L;
107:
108: case 0x40:
109: return (i & 0x3F) | 0xFFFFFF80L;
110: }
111:
112: return i;
113: }
114:
115: /*
116: * Fetch 'v' datum. Format as 'u' but zero extend.
117: */
118: long
119: getv()
120: {
121: register int i;
122: register long j;
123:
124: switch ((i = getd()) & 0xC0)
125: {
126: case 0xC0:
127: j = ((i & 0x3F) << 8) | (getd() & 0xFF);
128: j = (j << 8) | (getd() & 0xFF);
129: return (j << 8) | (getd() & 0xFF);
130:
131: case 0x80:
132: return ((i & 0x3F) << 8) | (getd() & 0xFF);
133: }
134:
135: return i & 0xFF;
136: }
137:
138: /*
139: * Fetch '4' datum.
140: */
141: long
142: get4()
143: {
144: register long j;
145:
146: j = getd() & 0xFF;
147: j = (j << 8) | (getd() & 0xFF);
148: j = (j << 8) | (getd() & 0xFF);
149: return (j << 8) | (getd() & 0xFF);
150: }
151:
152: /*
153: * Skip 'u' or 'v' datum.
154: */
155: void
156: skip()
157: {
158: switch (getd() & 0xC0)
159: {
160: case 0xC0:
161: getd();
162: getd();
163: getd();
164: break;
165:
166: case 0x80:
167: getd();
168: }
169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.