summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-04-18 13:36:42 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-04-18 13:36:42 +0330
commite26b306f5413a3fa7cb2e516b8662b32d7933db7 (patch)
tree4d8d0c61bf9b8faefd4a5fe5041a20e25ebecac8
parent3e51ec689bec7f50ebe5b9b13b1eb7b7c3688128 (diff)
fix string length bug
-rw-r--r--code/main.felan39
-rw-r--r--src/compiler/parser.c6
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);