summaryrefslogtreecommitdiff
path: root/ultimate.golem
diff options
context:
space:
mode:
Diffstat (limited to 'ultimate.golem')
-rw-r--r--ultimate.golem78
1 files changed, 78 insertions, 0 deletions
diff --git a/ultimate.golem b/ultimate.golem
new file mode 100644
index 0000000..5cff4fb
--- /dev/null
+++ b/ultimate.golem
@@ -0,0 +1,78 @@
+fn strlen(s);
+
+// typeless language
+// (i know, this stupid but me bad)
+
+const usage_str = "usage: %s <file>\n";
+
+fn main(argc, argv) {
+ var i;
+ var fp, data;
+ var toks;
+
+ if argc != 2 {
+ fprintf(stderr, usage_str, argv[0]);
+ return 1;
+ }
+ i = 0;
+ while i < argc {
+ puts(argv[i]);
+ }
+ fp = fopen(argv[1], "rb");
+ if fp == null {
+ perror("main");
+ return 1;
+ }
+ data = drain(fp);
+ fclose(fp);
+ if data == 0 {
+ fprintf(stderr, "failed to drain '%s'\n", argv[1]);
+ return 1;
+ }
+ toks = lexer(data);
+ free(data);
+ if toks == 0 {
+ fprintf(stderr, "lexer failed\n");
+ return 1;
+ }
+ lexer_print(toks);
+ lexer_free(toks);
+ return 0;
+}
+
+fn strlen(s) {
+ var i, len;
+
+ i = 0;
+ while s[i] {
+ len = len + ((s[i] & 0xFF) != 0);
+ len = len + ((s[i] & 0xFF00) != 0);
+ i += 1;
+ }
+ return len;
+}
+
+ft strlen(s) {
+ return s[0];
+}
+
+fn isdigit(c) {
+ return c >= '0' && c <= '9';
+}
+
+ft atoi(s) {
+ var ret;
+ var i;
+
+ ret = 0;
+ i = 1;
+ while i <= s[0] {
+ if !isdigit(s[i]) {
+ return ret;
+ }
+ ret *= 10;
+ ret += s[i] - '0';
+ i += 1;
+ }
+ return ret;
+}