From c0fea55f25ad1f675f40815cefb34b435f32119b Mon Sep 17 00:00:00 2001 From: sje Date: Thu, 23 Nov 2006 03:22:51 +0000 Subject: use ansi font services if unicode ones unavailable bugfixes to allow pure ansi build git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@57 4f64403b-2f21-0410-a795-97e2b3489a10 --- yapp/str_utils.cpp | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 yapp/str_utils.cpp (limited to 'yapp/str_utils.cpp') diff --git a/yapp/str_utils.cpp b/yapp/str_utils.cpp new file mode 100644 index 0000000..d9e3575 --- /dev/null +++ b/yapp/str_utils.cpp @@ -0,0 +1,229 @@ +#include "common.h" +#include "str_utils.h" + +int code_page = CP_ACP; + +void set_codepage() { + if(ServiceExists(MS_LANGPACK_GETCODEPAGE)) + code_page = CallService(MS_LANGPACK_GETCODEPAGE, 0, 0); +} + +bool a2w(const char *as, wchar_t *buff, int bufflen){ + if(as) MultiByteToWideChar(code_page, 0, as, -1, buff, bufflen); + return true; +} + +bool w2a(const wchar_t *ws, char *buff, int bufflen) { + if(ws) WideCharToMultiByte(code_page, 0, ws, -1, buff, bufflen, 0, 0); + return true; +} + +bool u2w(const char *us, wchar_t *buff, int bufflen) { + if(us) MultiByteToWideChar(CP_UTF8, 0, us, -1, buff, bufflen); + return true; +} + +bool w2u(const wchar_t *ws, char *buff, int bufflen) { + if(ws) WideCharToMultiByte(CP_UTF8, 0, ws, -1, buff, bufflen, 0, 0); + return true; +} + +bool a2u(const char *as, char *buff, int bufflen) { + if(!as) return false; + + wchar_t *ws = a2w(as); + if(ws) WideCharToMultiByte(CP_UTF8, 0, ws, -1, buff, bufflen, 0, 0); + free(ws); + return true; +} + +bool u2a(const char *us, char *buff, int bufflen) { + if(!us) return false; + + wchar_t *ws = u2w(us); + if(ws) WideCharToMultiByte(code_page, 0, ws, -1, buff, bufflen, 0, 0); + free(ws); + return true; +} + + +bool t2w(const TCHAR *ts, wchar_t *buff, int bufflen) { +#ifdef _UNICODE + wcsncpy(buff, ts, bufflen); + return true; +#else + return a2w(ts, buff, bufflen); +#endif +} + +bool w2t(const wchar_t *ws, TCHAR *buff, int bufflen) { +#ifdef _UNICODE + wcsncpy(buff, ws, bufflen); + return true; +#else + return w2a(ws, buff, bufflen); +#endif +} + +bool t2a(const TCHAR *ts, char *buff, int bufflen) { +#ifdef _UNICODE + return w2a(ts, buff, bufflen); +#else + strncpy(buff, ts, bufflen); + return true; +#endif +} + +bool a2t(const char *as, TCHAR *buff, int bufflen) { +#ifdef _UNICODE + return a2w(as, buff, bufflen); +#else + strncpy(buff, as, bufflen); + return true; +#endif +} + +bool t2u(const TCHAR *ts, char *buff, int bufflen) { +#ifdef _UNICODE + return w2u(ts, buff, bufflen); +#else + return a2u(ts, buff, bufflen); +#endif +} + +bool u2t(const char *us, TCHAR *buff, int bufflen) { +#ifdef _UNICODE + return u2w(us, buff, bufflen); +#else + return u2a(us, buff, bufflen); +#endif +} + +wchar_t *u2w(const char *us) { + if(us) { + int size = MultiByteToWideChar(CP_UTF8, 0, us, -1, 0, 0); + wchar_t *buff = (wchar_t *)malloc(size * sizeof(wchar_t)); + MultiByteToWideChar(CP_UTF8, 0, us, -1, buff, size); + return buff; + } else + return 0; +} + +char *w2u(const wchar_t *ws) { + if(ws) { + int size = WideCharToMultiByte(CP_UTF8, 0, ws, -1, 0, 0, 0, 0); + char *buff = (char *)malloc(size); + WideCharToMultiByte(CP_UTF8, 0, ws, -1, buff, size, 0, 0); + return buff; + } else + return 0; +} + +wchar_t *a2w(const char *as) { + int size = MultiByteToWideChar(code_page, 0, as, -1, 0, 0); + wchar_t *buff = (wchar_t *)malloc(size * sizeof(wchar_t)); + MultiByteToWideChar(code_page, 0, as, -1, buff, size); + return buff; +} + +char *w2a(const wchar_t *ws) { + int size = WideCharToMultiByte(code_page, 0, ws, -1, 0, 0, 0, 0); + char *buff = (char *)malloc(size); + WideCharToMultiByte(code_page, 0, ws, -1, buff, size, 0, 0); + return buff; +} + +char *u2a(const char *utfs) { + wchar_t *ws = u2w(utfs); + char *ret = w2a(ws); + free(ws); + return ret; +} + +char *a2u(const char *as) { + wchar_t *ws = a2w(as); + char *ret = w2u(ws); + free(ws); + return ret; +} + +TCHAR *w2t(const wchar_t *ws) { +#ifdef _UNICODE + return wcsdup(ws); +#else + return w2a(ws); +#endif +} + +wchar_t *t2w(const TCHAR *ts) { +#ifdef _UNICODE + return _tcsdup(ts); +#else + return a2w(ts); +#endif +} + + +char *t2a(const TCHAR *ts) { +#ifdef _UNICODE + return w2a(ts); +#else + return _strdup(ts); +#endif +} + +TCHAR *a2t(const char *as) { +#ifdef _UNICODE + return a2w(as); +#else + return _strdup(as); +#endif +} + +TCHAR *u2t(const char *utfs) { +#ifdef _UNICODE + return u2w(utfs); +#else + wchar_t *ws = u2w(utfs); + char *ret = w2a(ws); + free(ws); + return ret; +#endif +} + +char *t2u(const TCHAR *ts) { +#ifdef _UNICODE + return w2u(ts); +#else + wchar_t *ws = a2w(ts); + char *ret = w2u(ws); + free(ws); + return ret; +#endif +} + +void trimW(wchar_t *str) { + int len = wcslen(str), pos; + // trim whitespace (e.g. from OTR detection) + for(pos = len - 1; pos >= 0; pos--) { + if(str[pos] == L' ' || str[pos] == L'\t' || str[pos] == L'\r' || str[pos] == L'\n') str[pos] = 0; + else break; + } + + // remove tabs + for(pos = len - 1; pos >= 0; pos--) + if(str[pos] == L'\t') str[pos] = L' '; +} + +void trimA(char *str) { + int len = strlen(str), pos; + // trim whitespace (e.g. from OTR detection) + for(pos = len - 1; pos >= 0; pos--) { + if(str[pos] == ' ' || str[pos] == '\t' || str[pos] == '\r' || str[pos] == '\n') str[pos] = 0; + else break; + } + + // remove tabs + for(pos = len - 1; pos >= 0; pos--) + if(str[pos] == '\t') str[pos] = ' '; +} -- cgit v1.2.3