126 lines
2.9 KiB
C
126 lines
2.9 KiB
C
#include "str.h"
|
|
|
|
str str_copy(str src){
|
|
if(src.data == NULL || src.len == 0)
|
|
return src;
|
|
|
|
str nstr = str_construct((char*)malloc(src.len + 1), src.len, true);
|
|
memcpy(nstr.data, src.data, src.len);
|
|
nstr.data[nstr.len] = '\0';
|
|
return nstr;
|
|
}
|
|
|
|
bool str_equals(str s0, str s1){
|
|
if(s0.len != s1.len)
|
|
return false;
|
|
|
|
for(u32 i = 0; i < s0.len; i++)
|
|
if(s0.data[i] != s1.data[i])
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
str str_reverse(str s){
|
|
if(s.data == NULL || s.len == 0)
|
|
return s;
|
|
|
|
str r = str_construct(malloc(s.len), s.len, s.isZeroTerminated);
|
|
for(u32 i = 0; i < s.len; i++ )
|
|
r.data[i] = s.data[s.len - i - 1];
|
|
return r;
|
|
}
|
|
|
|
i32 str_seek(str src, str fragment, u32 startIndex){
|
|
if(src.len == 0 || fragment.len == 0)
|
|
return -1;
|
|
|
|
for(u32 i = startIndex; i < src.len - fragment.len + 1; i++){
|
|
for(u32 j = 0;; j++){
|
|
if(j == fragment.len)
|
|
return i;
|
|
if(src.data[i + j] != fragment.data[j])
|
|
break;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
i32 str_seekReverse(str src, str fragment, u32 startIndex){
|
|
if(src.len == 0 || fragment.len == 0)
|
|
return -1;
|
|
|
|
if(startIndex > src.len - 1)
|
|
startIndex = src.len - 1;
|
|
for(u32 i = startIndex; i >= fragment.len - 1; i--){
|
|
for(u32 j = 0;; j++){
|
|
if(j == fragment.len)
|
|
return i - j + 1;
|
|
if(src.data[i - j] != fragment.data[fragment.len - 1 - j])
|
|
break;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
i32 str_seekChar(str src, char c, u32 startIndex){
|
|
for(u32 i = startIndex; i < src.len; i++){
|
|
if(src.data[i] == c)
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
i32 str_seekCharReverse(str src, char c, u32 startIndex){
|
|
if(startIndex > src.len - 1)
|
|
startIndex = src.len - 1;
|
|
for(u32 i = startIndex; i != (u32)-1; i--){
|
|
if(src.data[i] == c)
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
bool str_startsWith(str src, str fragment){
|
|
if(src.len < fragment.len)
|
|
return false;
|
|
|
|
src.len = fragment.len;
|
|
return str_equals(src, fragment);
|
|
}
|
|
|
|
bool str_endsWith(str src, str fragment){
|
|
if(src.len < fragment.len)
|
|
return false;
|
|
|
|
src.data = (char*)(src.data + src.len - fragment.len);
|
|
src.len = fragment.len;
|
|
return str_equals(src, fragment);
|
|
}
|
|
|
|
u32 str_hash32(str s){
|
|
u8* ubuf = (u8*)s.data;
|
|
u32 hash=0;
|
|
for (u32 i = 0; i < s.len; i++)
|
|
hash = (hash<<6) + (hash<<16) - hash + ubuf[i];
|
|
return hash;
|
|
}
|
|
|
|
str str_toUpper(str src){
|
|
str r = str_copy(src);
|
|
for (u32 i = 0; i < r.len; i++){
|
|
if(isAlphabeticalLower(r.data[i]))
|
|
r.data[i] = r.data[i] - 'a' + 'A';
|
|
}
|
|
return r;
|
|
}
|
|
|
|
str str_toLower(str src){
|
|
str r = str_copy(src);
|
|
for (u32 i = 0; i < r.len; i++){
|
|
if(isAlphabeticalUpper(r.data[i]))
|
|
r.data[i] = r.data[i] - 'A' + 'a';
|
|
}
|
|
return r;
|
|
}
|