aboutsummaryrefslogtreecommitdiff
path: root/cstring/include/cstring.h
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2024-04-13 12:22:01 -0700
committer3gg <3gg@shellblade.net>2024-04-13 12:22:01 -0700
commit6aea96466ee881fa16116de6380ca693c95165e2 (patch)
tree71a34ef701801b0f69b5a07deee3415aca10c9df /cstring/include/cstring.h
parentadc770b08bf8ec2bb89b156e52fcc63c719c4a83 (diff)
Hard asserts.
Diffstat (limited to 'cstring/include/cstring.h')
-rw-r--r--cstring/include/cstring.h13
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 } \