summaryrefslogtreecommitdiff
path: root/samples/malloc.golem
diff options
context:
space:
mode:
Diffstat (limited to 'samples/malloc.golem')
-rw-r--r--samples/malloc.golem65
1 files changed, 65 insertions, 0 deletions
diff --git a/samples/malloc.golem b/samples/malloc.golem
new file mode 100644
index 0000000..762f78f
--- /dev/null
+++ b/samples/malloc.golem
@@ -0,0 +1,65 @@
+main() {
+ local s;
+ s = strdup("coucou le monde");
+ puts(s);
+ stoupper(s);
+ puts(s);
+}
+
+puts(s) {
+ loop {
+ if ([s] == 0) {
+ wrt '\n';
+ return 0;
+ }
+ wrt [s];
+ s = s + 1;
+ }
+}
+
+strlen(s) {
+ local len;
+ len = 0;
+ loop {
+ if ([s + len] == 0) {
+ return len;
+ }
+ len = len + 1;
+ }
+}
+
+strdup(s) {
+ return strcpy(malloc(strlen(s) + 1), s);
+}
+
+strcpy(dst, src) {
+ local i;
+ i = 0;
+ loop {
+ [dst + i] = [src + i];
+ i = i + 1;
+ if ([src + i] == 0)
+ return dst;
+ }
+}
+
+stoupper(s) {
+ loop {
+ if ([s] == 0) return 0;
+ [s] = [s] - ([s] >= 'a' & [s] <= 'z') * 32;
+ s = s + 1;
+ }
+}
+
+global heap[4096] = 0x69;
+global heap_size = 0;
+malloc(n) {
+ local p;
+ p = heap + heap_size;
+ heap_size = heap_size + n;
+ if (heap_size > 4096) {
+ puts("malloc error: heap is full");
+ return 0;
+ }
+ return p;
+}