diff options
Diffstat (limited to 'samples/malloc.golem')
-rw-r--r-- | samples/malloc.golem | 65 |
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; +} |