Search / Sort

This commit is contained in:
2026-08-30 22:24:45 +08:00
parent 3a4717a9d8
commit 0cb98557da
75 changed files with 7570 additions and 7 deletions
+20 -4
View File
@@ -36,9 +36,11 @@ c_StringView_t c_StringView_FromParts(const char* str, c_size_t len) {
C_STATIC_FORCE_INLINE
c_StringView_t c_StringView_Sub(const c_StringView_t* self, c_size_t start, c_size_t len) {
c_StringView_t result={0};
if (start < self->size) {
if (self && self->str && start < self->size) {
result.str = self->str + start;
result.size = ((start + len) <= self->size)?len:(self->size - start);
// 安全防御:通过减法判断可供截取的最大安全长度,防止 start + len 加法溢出
c_size_t max_available = self->size - start;
result.size = (len <= max_available) ? len : max_available;
}
return result;
}
@@ -109,14 +111,28 @@ c_index_t c_StringView_FindChar(const c_StringView_t* self, const c_size_t start
C_STATIC_FORCE_INLINE
bool c_StringView_Split(c_StringView_t * self, const char delim, c_StringView_t* left, c_StringView_t* right) {
if (!self || self->size == 0 || !self->str) {
if (left) *left = (c_StringView_t){NULL, 0};
if (right) *right = (c_StringView_t){NULL, 0};
return false;
}
const c_index_t idx = c_StringView_FindChar(self, 0, delim);
if (idx == -1) {
if (left) *left = *self;
if (right) *right = (c_StringView_t){ NULL, 0 };
return false;
}
if (left) *left = c_StringView_Sub(self, 0, idx);
if (right) *right = c_StringView_Sub(self, idx + 1, self->size - idx - 1);
if (left) *left = c_StringView_Sub(self, 0, (c_size_t)idx);
if (right) {
c_size_t next_start = (c_size_t)idx + 1;
if (next_start < self->size) {
// 使用逆向减法,确保绝对不会发生下溢
*right = c_StringView_Sub(self, next_start, self->size - next_start);
} else {
*right = (c_StringView_t){ NULL, 0 };
}
}
return true;
}