summaryrefslogtreecommitdiff
path: root/Build/source/utils/xml2pmx/xml2pmx-src/Builtin.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/xml2pmx/xml2pmx-src/Builtin.c')
-rw-r--r--Build/source/utils/xml2pmx/xml2pmx-src/Builtin.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/Build/source/utils/xml2pmx/xml2pmx-src/Builtin.c b/Build/source/utils/xml2pmx/xml2pmx-src/Builtin.c
new file mode 100644
index 00000000000..f74e3c0ea6b
--- /dev/null
+++ b/Build/source/utils/xml2pmx/xml2pmx-src/Builtin.c
@@ -0,0 +1,160 @@
+
+#include "obx.h"
+#include <ctype.h>
+#include <math.h>
+#include <string.h>
+
+char *lib_version =
+ "Oxford Oberon-2 library version 3.2beta1 [build hg-f2fdbc915d42]";
+
+value *NEW(value *bp) {
+ word desc = bp[HEAD+0].a;
+ int size = bp[HEAD+1].i+4;
+ value *sp = bp;
+ word p = gc_alloc(size, bp);
+ value *q = ptrcast(value, p);
+ q[0].a = desc;
+ (*--sp).a = p+4;
+ return sp;
+}
+
+/*
+Layout for flexible arrays:
+
+q: desc
+
+ element 0
+ ...
+ element n-1
+
+desc: map desc = q + align(n*elsize) + 4
+ dim 1
+ ...
+ dim k
+
+map: -4
+ desc-(q+4)
+[ GC_REPEAT if elmap != 0
+ 0
+ n
+ elsize
+ GC_MAP
+ elmap
+ GC_END ]
+ GC_END
+
+size = align(n*elsize) + 4*k + 20 + (28 if elmap != 0)
+
+Parameters NEWFLEX(elmap, elsize, k: INTEGER;
+ dim_0, ..., dim_{k-1}: INTEGER): SYSTEM.PTR
+*/
+
+value *NEWFLEX(value *bp) {
+ word elmap = bp[HEAD+0].a;
+ int elsize = bp[HEAD+1].i;
+ int k = bp[HEAD+2].i;
+ value *dim = &bp[HEAD+3]; /* Array of bounds */
+ value *sp = bp;
+
+ int size, arsize, i, n;
+ word p, desc, map;
+ value *q, *pdesc, *pmap;
+
+ /* Compute no. of elements */
+ n = 1;
+ for (i = 0; i < k; i++) n *= dim[i].i;
+ if (n < 0) liberror("allocating negative size");
+ arsize = align(n * elsize, 4);
+ if (n == 0) elmap = 0;
+
+ /* Allocate the space */
+ size = arsize + 4*k + 20;
+ if (elmap != 0) size += 28;
+
+ p = gc_alloc(size, bp);
+ desc = p + arsize + 4;
+ map = desc + 4*k + 4;
+
+ q = ptrcast(value, p);
+ pdesc = ptrcast(value, desc);
+ pmap = ptrcast(value, map);
+ q[0].a = desc;
+
+ /* Fill in the descriptor */
+ pdesc[DESC_MAP].a = map;
+ for (i = 0; i < k; i++) pdesc[DESC_BOUND+i].i = dim[i].i;
+
+ /* Fill in the map */
+ pmap[0].i = -4;
+ pmap[1].i = desc-(p+4);
+ if (elmap == 0)
+ pmap[2].i = GC_END;
+ else {
+ pmap[2].i = GC_REPEAT;
+ pmap[3].i = 0;
+ pmap[4].i = n;
+ pmap[5].i = elsize;
+ pmap[6].i = GC_MAP;
+ pmap[7].i = elmap;
+ pmap[8].i = GC_END;
+ pmap[9].i = GC_END;
+ }
+
+ (*--sp).a = p+4;
+ return sp;
+}
+
+value *COMPARE(value *bp) {
+ uchar *s1 = pointer(bp[HEAD+0]), *s2 = pointer(bp[HEAD+2]);
+ int i = 0, n = min(bp[HEAD+1].i, bp[HEAD+3].i);
+ value *sp = bp;
+
+ while (i < n && s1[i] != '\0' && s1[i] == s2[i]) i++;
+ if (i >= n) liberror("string is not null-terminated");
+ (*--sp).i = s1[i] - s2[i];
+ return sp;
+}
+
+value *COPY(value *bp) {
+ obcopy((char * ) pointer(bp[HEAD+2]), bp[HEAD+3].i,
+ (char * ) pointer(bp[HEAD+0]), bp[HEAD+1].i, bp);
+ return bp;
+}
+
+value *FLEXASSIGN(value *bp) {
+ int size = bp[HEAD+0].i;
+ int dim = bp[HEAD+1].i;
+ uchar *src = pointer(bp[HEAD+2]), *dst = pointer(bp[HEAD+dim+3]);
+ value *sbound = &bp[HEAD+3], *dbound = &bp[HEAD+dim+4];
+ int i;
+
+ for (i = 0; i < dim; i++) {
+ int sb = sbound[i].i, db = dbound[i].i;
+ if (sb > db || (i > 0 && sb < db))
+ liberror("bound mismatch in open array assignment");
+ size *= sb;
+ }
+
+ memmove(dst, src, size);
+ return bp;
+}
+
+value *sys_move(value *bp) {
+ memmove(pointer(bp[HEAD+1]), pointer(bp[HEAD+0]), bp[HEAD+2].i);
+ return bp;
+}
+
+value *sys_liberror(value *bp) {
+ value *bp1 = valptr(bp[BP]);
+ error_stop((char * ) pointer(bp[HEAD+0]), 0, 0, bp1, NULL);
+ return bp;
+}
+
+value *EASSERT(value *bp) {
+ int line = bp[HEAD+0].i;
+ int arg = bp[HEAD+1].i;
+ value *bp1 = valptr(bp[BP]);
+ uchar *pc = pointer(bp[PC]);
+ error_stop("assertion failed (%d)", arg, line, bp1, pc);
+ return bp;
+}