#ifndef __CORE_STR_H__ #define __CORE_STR_H__ #include "core_type.h" #include "core_impl.h" #include "log.h" typedef struct cstring { char* data; usize len; usize cap; } cstring_t; /** * 创建一个新的空字符串 */ static inline cstring_t cstring_new(void) { return (cstring_t) { .data = null, .len = 0, .cap = 0 }; } /** * 使用指定容量创建字符串 */ static inline cstring_t cstring_with_capacity(usize capacity) { char* data = null; if (capacity > 0) { data = (char*)smcc_malloc(capacity); Assert(data != null); } return (cstring_t) { .data = data, .len = 0, .cap = capacity }; } /** * 从 C 字符串创建 Rust 风格字符串 */ static inline cstring_t cstring_from_cstr(const char* s) { if (s == null) { return cstring_new(); } usize len = 0; const char* p = s; while (*p++) len++; char* data = (char*)smcc_malloc(len + 1); Assert(data != null); smcc_memcpy(data, s, len); data[len] = '\0'; return (cstring_t) { .data = data, .len = len, .cap = len }; } /** * 释放字符串资源 */ static inline void cstring_free(cstring_t* str) { if (str && str->data) { smcc_free(str->data); str->data = null; str->len = 0; str->cap = 0; } } /** * 向字符串追加内容 */ static inline void cstring_push_str(cstring_t* str, const char* data, usize len) { if (str == null || data == null || len == 0) { return; } // 如果需要扩容 if (str->len + len + 1 > str->cap) { // FIXME c string 兼容性问题 bad practice a lot of `+ 1` usize new_cap = str->cap == 0 ? len + 1 : str->cap; while (new_cap < str->len + len + 1) { new_cap *= 2; if (new_cap == 0) { // 处理溢出情况 new_cap = str->len + len + 1; break; } } char* new_data = str->data ? (char*)smcc_realloc(str->data, new_cap) : (char*)smcc_malloc(new_cap); Assert(new_data != null); str->data = new_data; str->cap = new_cap; } smcc_memcpy(str->data + str->len, data, len); str->len += len; str->data[str->len] = '\0'; // 保证 C 字符串兼容性 } /** * 向字符串追加单个字符 */ static inline void cstring_push(cstring_t* str, char ch) { cstring_push_str(str, &ch, 1); } /** * 获取字符串长度 */ static inline usize cstring_len(const cstring_t* str) { return str ? str->len : 0; } /** * 检查字符串是否为空 */ static inline cbool cstring_is_empty(const cstring_t* str) { return str == null || str->len == 0; } /** * 清空字符串内容但保留分配的内存 */ static inline void cstring_clear(cstring_t* str) { if (str) { str->len = 0; if (str->data) { str->data[0] = '\0'; } } } /** * 获取 C 风格字符串 */ static inline const char* cstring_as_cstr(const cstring_t* str) { if (str == null || str->data == null) { return ""; } return str->data; } #endif /* __CORE_STR_H__ */