#pragma once #include #include #include int char16cmp(const char16_t* s1, const char16_t* s2, size_t count); void char16cpy(char16_t* dest, const char16_t* src, size_t count); size_t char16len(const char16_t* s); void encode_sjis(char* dest, const char16_t* source, size_t dest_count); void decode_sjis(char16_t* dest, const char* source, size_t dest_count); std::string encode_sjis(const char16_t* source); std::u16string decode_sjis(const char* source); std::string encode_sjis(const std::u16string& source); std::u16string decode_sjis(const std::string& source); void add_language_marker_inplace(char* s, char marker, size_t dest_count); void add_language_marker_inplace(char16_t* s, char16_t marker, size_t dest_count); void remove_language_marker_inplace(char* s); void remove_language_marker_inplace(char16_t* s); std::string add_language_marker(const std::string& s, char marker); std::u16string add_language_marker(const std::u16string& s, char16_t marker); std::string remove_language_marker(const std::string& s); std::u16string remove_language_marker(const std::u16string& s); template void replace_char_inplace(T* a, T f, T r) { while (*a) { if (*a == f) { *a = r; } a++; } } template size_t add_color_inplace(T* a) { T* d = a; T* orig_d = d; while (*a) { if (*a == '$') { *(d++) = '\t'; } else if (*a == '#') { *(d++) = '\n'; } else if (*a == '%') { a++; if (*a == 's') { *(d++) = '$'; } else if (*a == '%') { *(d++) = '%'; } else if (*a == 'n') { *(d++) = '#'; } else { *(d++) = *a; } } else { *(d++) = *a; } a++; } *d = 0; return d - orig_d; } template void add_color_inplace(std::basic_string& a, size_t header_bytes) { size_t count = add_color_inplace(const_cast(a.data() + header_bytes)); a.resize(count + header_bytes); }