CDString* CD_CreateStringFromFormatList (const char* format, va_list ap) { CDString* self = CD_CreateString(); bvcformata(self->raw, 9001, format, ap); cd_UpdateLength(self); return self; }
CDString* CD_CloneString (CDString* self) { CDString* cloned = CD_CreateString(); bdestroy(cloned->raw); cloned->raw = (CDRawString) bstrcpy(self->raw); assert(cloned->raw); cd_UpdateLength(cloned); return cloned; }
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; }