diff options
Diffstat (limited to 'ultimate.golem')
-rw-r--r-- | ultimate.golem | 78 |
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; +} |