#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; }