Search / Sort
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user