diff options
| author | 3gg <3gg@shellblade.net> | 2024-04-13 12:22:01 -0700 |
|---|---|---|
| committer | 3gg <3gg@shellblade.net> | 2024-04-13 12:22:01 -0700 |
| commit | 6aea96466ee881fa16116de6380ca693c95165e2 (patch) | |
| tree | 71a34ef701801b0f69b5a07deee3415aca10c9df /cstring/include/cstring.h | |
| parent | adc770b08bf8ec2bb89b156e52fcc63c719c4a83 (diff) | |
Hard asserts.
Diffstat (limited to 'cstring/include/cstring.h')
| -rw-r--r-- | cstring/include/cstring.h | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/cstring/include/cstring.h b/cstring/include/cstring.h index 991d742..134e68e 100644 --- a/cstring/include/cstring.h +++ b/cstring/include/cstring.h | |||
| @@ -1,17 +1,14 @@ | |||
| 1 | /// Fixed-size strings with value semantics. | 1 | /// Fixed-size strings with value semantics. |
| 2 | #pragma once | 2 | #pragma once |
| 3 | 3 | ||
| 4 | #include <assert.h> | ||
| 5 | #include <bsd/string.h> | 4 | #include <bsd/string.h> |
| 5 | #include <cassert.h> | ||
| 6 | #include <stdbool.h> | 6 | #include <stdbool.h> |
| 7 | #include <stdint.h> | 7 | #include <stdint.h> |
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | 9 | ||
| 10 | /// A fixed-size string. | 10 | /// A fixed-size string. |
| 11 | /// The string is null-terminated so that it can be used with the usual C APIs. | 11 | /// The string is null-terminated so that it can be used with the usual C APIs. |
| 12 | // | ||
| 13 | // TODO: The asserts on length should be hard asserts, not just asserts in debug | ||
| 14 | // builds. | ||
| 15 | #define DEF_STRING(STRING, SIZE) \ | 12 | #define DEF_STRING(STRING, SIZE) \ |
| 16 | typedef struct STRING { \ | 13 | typedef struct STRING { \ |
| 17 | size_t length; \ | 14 | size_t length; \ |
| @@ -55,19 +52,19 @@ | |||
| 55 | \ | 52 | \ |
| 56 | static inline void STRING##_append_cstr(STRING* a, const char* b) { \ | 53 | static inline void STRING##_append_cstr(STRING* a, const char* b) { \ |
| 57 | size_t b_length = strlen(b); \ | 54 | size_t b_length = strlen(b); \ |
| 58 | assert(a->length + b_length + 1 < SIZE); \ | 55 | ASSERT(a->length + b_length + 1 < SIZE); \ |
| 59 | strlcpy(a->str + a->length, b, SIZE); \ | 56 | strlcpy(a->str + a->length, b, SIZE); \ |
| 60 | a->length = a->length + b_length; \ | 57 | a->length = a->length + b_length; \ |
| 61 | } \ | 58 | } \ |
| 62 | \ | 59 | \ |
| 63 | static inline void STRING##_append(STRING* a, STRING b) { \ | 60 | static inline void STRING##_append(STRING* a, STRING b) { \ |
| 64 | assert(a->length + b.length + 1 < SIZE); \ | 61 | ASSERT(a->length + b.length + 1 < SIZE); \ |
| 65 | strlcpy(a->str + a->length, b.str, SIZE); \ | 62 | strlcpy(a->str + a->length, b.str, SIZE); \ |
| 66 | a->length = a->length + b.length; \ | 63 | a->length = a->length + b.length; \ |
| 67 | } \ | 64 | } \ |
| 68 | \ | 65 | \ |
| 69 | static inline STRING STRING##_concat(STRING a, STRING b) { \ | 66 | static inline STRING STRING##_concat(STRING a, STRING b) { \ |
| 70 | assert(a.length + b.length + 1 < SIZE); \ | 67 | ASSERT(a.length + b.length + 1 < SIZE); \ |
| 71 | STRING str = {0}; \ | 68 | STRING str = {0}; \ |
| 72 | strlcpy(str.str, a.str, SIZE); \ | 69 | strlcpy(str.str, a.str, SIZE); \ |
| 73 | strlcpy(str.str + a.length, b.str, SIZE); \ | 70 | strlcpy(str.str + a.length, b.str, SIZE); \ |
| @@ -99,7 +96,7 @@ | |||
| 99 | static inline STRING STRING##_itoa(int n) { \ | 96 | static inline STRING STRING##_itoa(int n) { \ |
| 100 | STRING str = (STRING){0}; \ | 97 | STRING str = (STRING){0}; \ |
| 101 | const int written = snprintf(str.str, SIZE, "%d", n); \ | 98 | const int written = snprintf(str.str, SIZE, "%d", n); \ |
| 102 | assert(written >= 0); \ | 99 | ASSERT(written >= 0); \ |
| 103 | str.length = (size_t)written; \ | 100 | str.length = (size_t)written; \ |
| 104 | return str; \ | 101 | return str; \ |
| 105 | } \ | 102 | } \ |
