void SV_BufferAddString (CDBuffer* self, CDString* data) { CDString* sanitized = SV_StringSanitize(data); SVShort size = htons(CD_StringSize(sanitized)); evbuffer_add(self->raw, &size, SVShortSize); evbuffer_add(self->raw, CD_StringContent(sanitized), CD_StringSize(sanitized)); SV_DestroyString(sanitized); }
bool MC_StringIsValid (MCString self) { assert(self); for (size_t i = 0, ie = CD_StringLength(self); i < ie; i++) { bool has = false; CDString* ch = CD_CharAt(self, i); for (size_t h = 0, he = cd_UTF8_strlen(MCCharset); h < he; h++) { const char* che = &MCCharset[cd_UTF8_offset(MCCharset, h)]; if (strncmp(CD_StringContent(ch), che, CD_StringSize(ch)) == 0) { has = true; break; } } if (!has && !(strncmp(CD_StringContent(ch), "§", 2) == 0 && i < ie - 2)) { CD_DestroyString(ch); return false; } CD_DestroyString(ch); } return true; }
inline bool CD_StringEndWith (CDString* self, const char* check) { size_t length = strlen(check); return strncmp(CD_StringContent(self) + CD_StringSize(self) - length, check, length) == 0; }
MCString MC_StringSanitize (MCString self) { CDString* result = CD_CreateString(); assert(self); for (size_t i = 0, ie = CD_StringLength(self); i < ie; i++) { bool has = false; CDString* ch = CD_CharAt(self, i); for (size_t h = 0, he = cd_UTF8_strlen(MCCharset); h < he; h++) { const char* che = &MCCharset[cd_UTF8_offset(MCCharset, h)]; if (strncmp(CD_StringContent(ch), che, CD_StringSize(ch)) == 0) { has = true; break; } } if (i == ie - 2 && strncmp(CD_StringContent(ch), "§", 2) == 0){ CD_DestroyString(ch); break; } if (has || strncmp(CD_StringContent(ch), "§", 2) == 0) { CD_AppendString(result, ch); } else { CD_AppendCString(result, "?"); } CD_DestroyString(ch); } cd_UpdateLength(self); return result; }