DEADSOFTWARE

first cpc release
[cpc.git] / C / SYSTEM.c
1 #include "SYSTEM.h"
3 SYSTEM_MODDESC *SYSTEM_modlist = NIL;
4 SYSTEM_DLINK *SYSTEM_dlink = NIL;
6 LONGINT SYSTEM_INF = 0x7FF0000000000000L;
7 INTEGER SYSTEM_INFS = 0x7F800000;
9 CHAR SYSTEM_strBuf[32][256];
10 INTEGER SYSTEM_actual;
12 INTEGER SYSTEM_argCount;
13 void *SYSTEM_argVector;
15 void SYSTEM_REGMOD(SYSTEM_MODDESC *mod)
16 {
17 int i;
18 mod->next = SYSTEM_modlist;
19 SYSTEM_modlist = mod;
20 for (i = 0; i < mod->nofimps; i++) mod->imports[i]->refcnt++;
21 }
23 typedef struct {
24 INTEGER gc[3], len[1];
25 } Array;
27 void *SYSTEM_NEWARR(INTEGER type, INTEGER n)
28 {
29 int ptr = Kernel_NewArr(type, n, 1);
30 ((Array*)ptr)->len[0] = n;
31 return (void*)ptr;
32 }
34 void *SYSTEM_NEWARR1(INTEGER type, INTEGER n0, INTEGER n)
35 {
36 int ptr = Kernel_NewArr(type, n * n0, 1);
37 ((Array*)ptr)->len[0] = n0;
38 return (void*)ptr;
39 }
41 void *SYSTEM_NEWARR2(INTEGER type, INTEGER n1, INTEGER n0, INTEGER n)
42 {
43 int ptr = Kernel_NewArr(type, n * n0 * n1, 2);
44 ((Array*)ptr)->len[0] = n1;
45 ((Array*)ptr)->len[1] = n0;
46 return (void*)ptr;
47 }
49 void *SYSTEM_NEWARR3(INTEGER type, INTEGER n2, INTEGER n1, INTEGER n0, INTEGER n)
50 {
51 int ptr = Kernel_NewArr(type, n * n0 * n1 * n2, 3);
52 ((Array*)ptr)->len[0] = n2;
53 ((Array*)ptr)->len[1] = n1;
54 ((Array*)ptr)->len[2] = n0;
55 return (void*)ptr;
56 }
58 void *SYSTEM_NEWARR4(INTEGER type, INTEGER n3, INTEGER n2, INTEGER n1, INTEGER n0, INTEGER n)
59 {
60 int ptr = Kernel_NewArr(type, n * n0 * n1 * n2 * n3, 4);
61 ((Array*)ptr)->len[0] = n3;
62 ((Array*)ptr)->len[1] = n2;
63 ((Array*)ptr)->len[2] = n1;
64 ((Array*)ptr)->len[3] = n0;
65 return (void*)ptr;
66 }
68 INTEGER SYSTEM_XCHK(INTEGER i, INTEGER ub)
69 {
70 if ((unsigned)(i)>=(unsigned)(ub)) __HALT(-7);
71 return i;
72 }
75 CHAR* SYSTEM_LSTR(char *x)
76 {
77 CHAR *str = SYSTEM_strBuf[SYSTEM_actual];
78 int i = 0;
79 SYSTEM_actual = (SYSTEM_actual + 1) & 0x1F;
80 do {
81 if (i == 256) __HALT(-8);
82 str[i] = x[i];
83 } while (x[i++] != 0);
84 return str;
85 }
87 INTEGER SYSTEM_ASH(INTEGER x, INTEGER n)
88 {
89 if (n >= 0) return x << n;
90 else return x >> (-n);
91 }
93 LONGINT SYSTEM_ASHL(LONGINT x, INTEGER n)
94 {
95 if (n >= 0) return x << n;
96 else return x >> (-n);
97 }
99 INTEGER SYSTEM_ABS(INTEGER x)
101 if (x<0) x=-x;
102 return x;
105 LONGINT SYSTEM_ABSL(LONGINT x)
107 if (x<0) x=-x;
108 return x;
111 SHORTREAL SYSTEM_ABSF(SHORTREAL x)
113 if (x<0) x=-x;
114 return x;
117 REAL SYSTEM_ABSD(REAL x)
119 if (x<0) x=-x;
120 return x;
123 INTEGER SYSTEM_ENTIER(REAL x)
125 INTEGER i;
126 i = (INTEGER)x;
127 if (i > x) i--;
128 return i;
131 LONGINT SYSTEM_ENTIERL(REAL x)
133 LONGINT i;
134 i = (LONGINT)x;
135 if (i > x) i--;
136 return i;
139 INTEGER SYSTEM_DIV(INTEGER x, INTEGER y)
141 if (y > 0) {
142 if (x < 0) return ~(~x / y);
143 else return x / y;
144 } else if (y < 0) {
145 if (x > 0) return ~((x - 1) / -y);
146 else return -x / -y;
147 } else {
148 __HALT(-5);
152 LONGINT SYSTEM_DIVL(LONGINT x, LONGINT y)
154 if (y > 0) {
155 if (x < 0) return ~(~x / y);
156 else return x / y;
157 } else if (y < 0) {
158 if (x > 0) return ~((x - 1) / -y);
159 else return -x / -y;
160 } else {
161 __HALT(-5);
165 INTEGER SYSTEM_MOD(INTEGER x, INTEGER y)
167 if (y > 0) {
168 if (x < 0) return y + ~(~x % y);
169 else return x % y;
170 } else if (y < 0) {
171 if (x > 0) return y + 1 + ((x - 1) % -y);
172 else return -(-x % -y);
173 } else {
174 __HALT(-5);
178 LONGINT SYSTEM_MODL(LONGINT x, LONGINT y)
180 if (y > 0) {
181 if (x < 0) return y + ~(~x % y);
182 else return x % y;
183 } else if (y < 0) {
184 if (x > 0) return y + 1 + ((x - 1) % -y);
185 else return -(-x % -y);
186 } else {
187 __HALT(-5);
191 INTEGER SYSTEM_MIN(INTEGER x, INTEGER y)
193 if (x > y) x = y;
194 return x;
197 LONGINT SYSTEM_MINL(LONGINT x, LONGINT y)
199 if (x > y) x = y;
200 return x;
203 SHORTREAL SYSTEM_MINF(SHORTREAL x, SHORTREAL y)
205 if (x > y) x = y;
206 return x;
209 REAL SYSTEM_MIND(REAL x, REAL y)
211 if (x > y) x = y;
212 return x;
215 INTEGER SYSTEM_MAX(INTEGER x, INTEGER y)
217 if (x < y) x = y;
218 return x;
221 LONGINT SYSTEM_MAXL(LONGINT x, LONGINT y)
223 if (x < y) x = y;
224 return x;
227 SHORTREAL SYSTEM_MAXF(SHORTREAL x, SHORTREAL y)
229 if (x < y) x = y;
230 return x;
233 REAL SYSTEM_MAXD(REAL x, REAL y)
235 if (x < y) x = y;
236 return x;
240 SHORTREAL SYSTEM_INT2SR(INTEGER x)
242 return *(SHORTREAL*)&x;
245 REAL SYSTEM_LONG2R(LONGINT x)
247 return *(REAL*)&x;
250 INTEGER SYSTEM_SR2INT(SHORTREAL x)
252 return *(INTEGER*)&x;
255 LONGINT SYSTEM_R2LONG(REAL x)
257 return *(LONGINT*)&x;
263 INTEGER SYSTEM_STRLEN(CHAR x[]) /* LEN(lx$) */
265 int i = 0;
266 while (x[i] != 0) i++;
267 return i;
270 INTEGER SYSTEM_STRLENS(SHORTCHAR x[]) /* LEN(sx$) */
272 int i = 0;
273 while (x[i] != 0) i++;
274 return i;
277 INTEGER SYSTEM_STRCMPSS(SHORTCHAR x[], SHORTCHAR y[]) /* sx = sy */
279 int i = 0;
280 while (x[i] == y[i] && y[i] != 0) i++;
281 return x[i] - y[i];
284 INTEGER SYSTEM_STRCMPTS(CHAR x[], SHORTCHAR y[]) /* SHORT(lx) = sy */
286 int i = 0;
287 while ((x[i] & 0xff) == y[i] && y[i] != 0) i++;
288 return (x[i] & 0xff) - y[i];
291 INTEGER SYSTEM_STRCMPTT(CHAR x[], CHAR y[]) /* SHORT(lx) = SHORT(ly) */
293 int i = 0;
294 while ((x[i] & 0xff) == (y[i] & 0xff) && (y[i] & 0xff) != 0) i++;
295 return (x[i] & 0xff) - (y[i] & 0xff);
298 INTEGER SYSTEM_STRCMPLL(CHAR x[], CHAR y[]) /* lx = ly */
300 int i = 0;
301 while (x[i] == y[i] && y[i] != 0) i++;
302 return x[i] - y[i];
305 INTEGER SYSTEM_STRCMPSL(SHORTCHAR x[], CHAR y[]) /* LONG(sx) = ly */
307 int i = 0;
308 while (x[i] == y[i] && y[i] != 0) i++;
309 return x[i] - y[i];
312 INTEGER SYSTEM_STRCMPTL(CHAR x[], CHAR y[]) /* LONG(SHORT(lx)) = ly */
314 int i = 0;
315 while ((x[i] & 0xff) == y[i] && y[i] != 0) i++;
316 return (x[i] & 0xff) - y[i];
319 void SYSTEM_STRCOPYSS(SHORTCHAR x[], SHORTCHAR y[], INTEGER n) /* sy := sx */
321 int i = 0;
322 do {
323 if (n-- == 0) __HALT(-8);
324 y[i] = x[i];
325 } while (x[i++] != 0);
328 void SYSTEM_STRCOPYTS(CHAR x[], SHORTCHAR y[], INTEGER n) /* sy := SHORT(lx) */
330 int i = 0;
331 do {
332 if (n-- == 0) __HALT(-8);
333 y[i] = (SHORTCHAR)x[i];
334 } while ((x[i++] & 0xff) != 0);
337 void SYSTEM_STRCOPYLL(CHAR x[], CHAR y[], INTEGER n) /* ly := lx */
339 int i = 0;
340 do {
341 if (n-- == 0) __HALT(-8);
342 y[i] = x[i];
343 } while (x[i++] != 0);
346 void SYSTEM_STRCOPYSL(SHORTCHAR x[], CHAR y[], INTEGER n) /* ly := LONG(sx) */
348 int i = 0;
349 do {
350 if (n-- == 0) __HALT(-8);
351 y[i] = x[i];
352 } while (x[i++] != 0);
355 void SYSTEM_STRCOPYTL(CHAR x[], CHAR y[], INTEGER n) /* ly := LONG(SHORT(lx)) */
357 int i = 0;
358 do {
359 if (n-- == 0) __HALT(-8);
360 y[i] = (x[i] & 0xff);
361 } while ((x[i++] & 0xff) != 0);
364 void SYSTEM_STRAPNDSS(SHORTCHAR x[], SHORTCHAR y[], INTEGER n) /* sy := sy + sx */
366 int i = 0, j = 0;
367 while (y[j] != 0) j++;
368 do {
369 if (n-- == 0) __HALT(-8);
370 y[j++] = x[i];
371 } while (x[i++] != 0);
374 void SYSTEM_STRAPNDTS(CHAR x[], SHORTCHAR y[], INTEGER n) /* sy := sy + SHORT(lx) */
376 int i = 0, j = 0;
377 while (y[j] != 0) j++;
378 do {
379 if (n-- == 0) __HALT(-8);
380 y[j++] = (SHORTCHAR)x[i];
381 } while ((x[i++] & 0xff) != 0);
384 void SYSTEM_STRAPNDLL(CHAR x[], CHAR y[], INTEGER n) /* ly := ly + lx */
386 int i = 0, j = 0;
387 while (y[j] != 0) j++;
388 do {
389 if (n-- == 0) __HALT(-8);
390 y[j++] = x[i];
391 } while (x[i++] != 0);
394 void SYSTEM_STRAPNDSL(SHORTCHAR x[], CHAR y[], INTEGER n) /* ly := ly + LONG(sx) */
396 int i = 0, j = 0;
397 while (y[j] != 0) j++;
398 do {
399 if (n-- == 0) __HALT(-8);
400 y[j++] = x[i];
401 } while (x[i++] != 0);
404 void SYSTEM_STRAPNDTL(CHAR x[], CHAR y[], INTEGER n) /* ly := ly + LONG(SHORT(lx)) */
406 int i = 0, j = 0;
407 while (y[j] != 0) j++;
408 do {
409 if (n-- == 0) __HALT(-8);
410 y[j++] = (x[i] & 0xff);
411 } while ((x[i++] & 0xff) != 0);