diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2025-02-10 22:07:19 +0100 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2025-02-10 22:07:19 +0100 |
| commit | 803deb4a70180f987fdeb99d617631cf9a092b4d (patch) | |
| tree | f20afd4d925c28cd2226237d383c773a3cd38c0b | |
| parent | 8a9e6b1bd3be1041792311a86d8aac68b659e891 (diff) | |
fix(string): Valid string copy
| -rw-r--r-- | json.c | 11 | ||||
| -rw-r--r-- | main.c | 10 | ||||
| -rw-r--r-- | string.c | 2 |
3 files changed, 11 insertions, 12 deletions
@@ -72,7 +72,7 @@ typedef struct { } parse_string_result; parse_string_result parse_string(Arena *a, Str src, uintptr_t pos) { - printf("json.parse_string: %s", src.data + pos); + printf("json.parse_string: %s\n", src.data + pos); assert(src.data[pos] == '"'); int i = 1; @@ -81,18 +81,15 @@ parse_string_result parse_string(Arena *a, Str src, uintptr_t pos) { assert(i + pos <= src.len); } assert(src.data[pos + i]); - char *s; - memcpy(s, src.data + pos + 1, i - 1); + Str s = Str_copy(a, &src.data[pos + 1], i - 1); - printf("%s", s); - - return (parse_string_result){Str_copy(a, src.data + pos + 1, i - 1), pos + i}; + return (parse_string_result){s, pos + i}; } JSON JSON_parse(Arena *a, Str src) { JSON json = {0}; int pos = 0; - // printf("json.parse: src=%s", src.data); + printf("json.parse: src=%s\n", src.data); if (isdigit(src.data[pos])) { parse_integer_result result = parse_integer(a, src, 0); json.integer = &result.value; @@ -22,7 +22,10 @@ typedef struct { int main() { Arena perm = Arena_new(128e3); + // Testing string assert(Str_equals(S("Bonjour"), S("Bonjour"))); + Str s = S("Hello"); + assert(Str_equals(s, Str_copy(&perm, s.data, s.len))); // Testing JSON printf("Arena: mem=%d B\n", Arena_get_used(perm)); JSON json_int = JSON_parse(&perm, S("123")); @@ -39,9 +42,8 @@ int main() { printf("Arena: mem=%d B\n", Arena_get_used(perm)); assert(*Vec_get(JSON_parse(&perm, S("[1, 2, 3]")).array, int, 1) == 2); printf("Arena: mem=%d B\n", Arena_get_used(perm)); - Str a = S("\"abc\""); - JSON s = JSON_parse(&perm, S("\"abc\"")); - // printf("%s (%d)\n", s.string->data, s.string->len); - // assert(Str_equals(*JSON_parse(&perm, S("\"abc\"")).string, S("abc")) == 1); + JSON js = JSON_parse(&perm, S("\"abc\"")); + assert(Str_equals(*js.string, S("abc")) == 1); + printf("Arena: mem=%d B\n", Arena_get_used(perm)); return 0; } @@ -25,7 +25,7 @@ uint64_t Str_hash64(Str s) { } Str Str_copy(Arena *a, char *data, uintptr_t len) { - Str str = {0}; + Str str = {0,len}; str.data = new (a, char, len); if (str.len) memcpy(str.data, data, len); |
