diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-18 13:36:42 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-18 13:36:42 +0330 |
commit | e26b306f5413a3fa7cb2e516b8662b32d7933db7 (patch) | |
tree | 4d8d0c61bf9b8faefd4a5fe5041a20e25ebecac8 | |
parent | 3e51ec689bec7f50ebe5b9b13b1eb7b7c3688128 (diff) |
fix string length bug
-rw-r--r-- | code/main.felan | 39 | ||||
-rw-r--r-- | src/compiler/parser.c | 6 |
2 files changed, 43 insertions, 2 deletions
diff --git a/code/main.felan b/code/main.felan index 132c24e..4610ccc 100644 --- a/code/main.felan +++ b/code/main.felan @@ -1,5 +1,10 @@ +string :: []u8; + main :: () -> void { - print("Hello world!\n"); + str := "123"; + print(str); + v := to_u64(str); + print(v); }; print :: (value:[]u8)->void{ @@ -10,3 +15,35 @@ print :: (value:[]u8)->void{ } }; +print :: (value:u64)->void{ + value := value; + result :[20]u8 = undefined; + i := 0; + while { + result[i] = '0' + @cast(value % 10,u8); + i += 1; + value /= 10; + value != 0; + } {} + + j := 0; + while j < i { + putc result[j]; + j += 1; + } +}; + +to_u64 :: (value:string) -> u64 { + i :u64= 0; + result :u64= 0; + + c :u8= undefined; + while i < value.length { + c = value[value.length-i-1]; + result *= 10; + result += @cast(c - '0',u64); + i += 1; + } + return result; +}; + diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 6f3e956..f5009e5 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -1121,7 +1121,7 @@ ParserNode *parserString(LexerNode *node, ParserNode *parent) { metadata->begin = metadata->end = a404m_malloc( sizeof(*metadata->begin) * (node->str_end - node->str_begin)); - for (char *iter = node->str_begin + 1; iter < node->str_end - 2; ++iter) { + for (char *iter = node->str_begin + 1; iter < node->str_end - 1; ++iter) { if (*iter == '\\') { iter += 1; bool success; @@ -1136,6 +1136,10 @@ ParserNode *parserString(LexerNode *node, ParserNode *parent) { metadata->end += 1; } + size_t size = metadata->end - metadata->begin; + metadata->begin = a404m_realloc(metadata->begin, size * (*metadata->begin)); + metadata->end = metadata->begin + size; + return node->parserNode = newParserNode(PARSER_TOKEN_VALUE_STRING, node->str_begin, node->str_end, metadata, parent); |