|
|
|
|
@ -359,7 +359,7 @@ void Window::Write(int limit, const wstring &str, bool clrtoeol) |
|
|
|
|
if (!collect) |
|
|
|
|
{ |
|
|
|
|
tmp += *it; |
|
|
|
|
limit--; |
|
|
|
|
limit -= wcwidth(*it); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (collect) |
|
|
|
|
@ -371,7 +371,7 @@ void Window::Write(int limit, const wstring &str, bool clrtoeol) |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
limit -= color.length(); |
|
|
|
|
limit -= Length(color); |
|
|
|
|
tmp += color; |
|
|
|
|
color = *it; |
|
|
|
|
} |
|
|
|
|
@ -390,7 +390,7 @@ void Window::Write(int limit, const wstring &str, bool clrtoeol) |
|
|
|
|
int x, y; |
|
|
|
|
getyx(itsWindow, y, x); |
|
|
|
|
Coordinates coords = IntoCoordinates(ToString(color)); |
|
|
|
|
wmove(itsWindow, coords.second == -1 ? y : coords.second, coords.first); |
|
|
|
|
wmove(itsWindow, coords.second < 0 ? y : coords.second, coords.first); |
|
|
|
|
limit -= coords.first-x; |
|
|
|
|
} |
|
|
|
|
else if (IsValidColor(ToString(color))) |
|
|
|
|
@ -400,7 +400,7 @@ void Window::Write(int limit, const wstring &str, bool clrtoeol) |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
limit -= color.length(); |
|
|
|
|
limit -= Length(color); |
|
|
|
|
tmp += limit > 0 ? color : color.substr(0, color.length()+limit); |
|
|
|
|
} |
|
|
|
|
color.clear(); |
|
|
|
|
@ -449,6 +449,9 @@ string Window::GetString(const string &base, unsigned int length, int width) con |
|
|
|
|
string tmp_in; |
|
|
|
|
wchar_t wc_in; |
|
|
|
|
|
|
|
|
|
mbstate_t state; |
|
|
|
|
memset(&state, 0, sizeof(state)); |
|
|
|
|
|
|
|
|
|
maxbeginning = beginning = tmp.length() < width ? 0 : tmp.length()-width; |
|
|
|
|
maxx += tmp.length() < width ? tmp.length() : width; |
|
|
|
|
x = maxx; |
|
|
|
|
@ -528,7 +531,7 @@ string Window::GetString(const string &base, unsigned int length, int width) con |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
tmp_in += input; |
|
|
|
|
if (mbtowc(&wc_in, tmp_in.c_str(), MB_CUR_MAX) < 0) |
|
|
|
|
if ((int)mbrtowc(&wc_in, tmp_in.c_str(), MB_CUR_MAX, &state) < 0) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
if ((x-minx)+beginning >= tmp.length()) |
|
|
|
|
@ -665,23 +668,39 @@ wchar_t * ToWString(const char *s) |
|
|
|
|
string ToString(const wstring &ws) |
|
|
|
|
{ |
|
|
|
|
string s; |
|
|
|
|
for (wstring::const_iterator it = ws.begin(); it != ws.end(); it++) |
|
|
|
|
{ |
|
|
|
|
char *c = new char[MB_CUR_MAX+1](); |
|
|
|
|
if (wctomb(c, *it) > 0) |
|
|
|
|
s += c; |
|
|
|
|
delete [] c; |
|
|
|
|
} |
|
|
|
|
const wchar_t *c_ws = ws.c_str(); |
|
|
|
|
mbstate_t mbs; |
|
|
|
|
memset(&mbs, 0, sizeof(mbs)); |
|
|
|
|
int len = wcsrtombs(NULL, &c_ws, 0, &mbs); |
|
|
|
|
|
|
|
|
|
if (len <= 0) |
|
|
|
|
return s; |
|
|
|
|
|
|
|
|
|
char *c_s = new char[len+1](); |
|
|
|
|
wcsrtombs(c_s, &c_ws, len, &mbs); |
|
|
|
|
c_s[len] = 0; |
|
|
|
|
s = c_s; |
|
|
|
|
delete [] c_s; |
|
|
|
|
return s; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
wstring ToWString(const string &s) |
|
|
|
|
{ |
|
|
|
|
wchar_t *ws = new wchar_t[s.length()+1](); |
|
|
|
|
mbstowcs(ws, s.c_str(), s.length()); |
|
|
|
|
wstring result = ws; |
|
|
|
|
delete [] ws; |
|
|
|
|
return result; |
|
|
|
|
wstring ws; |
|
|
|
|
const char *c_s = s.c_str(); |
|
|
|
|
mbstate_t mbs; |
|
|
|
|
memset(&mbs, 0, sizeof(mbs)); |
|
|
|
|
int len = mbsrtowcs(NULL, &c_s, 0, &mbs); |
|
|
|
|
|
|
|
|
|
if (len <= 0) |
|
|
|
|
return ws; |
|
|
|
|
|
|
|
|
|
wchar_t *c_ws = new wchar_t[len+1](); |
|
|
|
|
mbsrtowcs(c_ws, &c_s, len, &mbs); |
|
|
|
|
c_ws[len] = 0; |
|
|
|
|
ws = c_ws; |
|
|
|
|
delete [] c_ws; |
|
|
|
|
return ws; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Coordinates Window::IntoCoordinates(const string &s) |
|
|
|
|
@ -730,7 +749,7 @@ string Window::OmitBBCodes(const string &str) |
|
|
|
|
{ |
|
|
|
|
result += tmp; |
|
|
|
|
tmp.clear(); |
|
|
|
|
if (!IsValidColor(color)) |
|
|
|
|
if (!isdigit(tmp[2]) && !IsValidColor(color)) |
|
|
|
|
tmp += color; |
|
|
|
|
color.clear(); |
|
|
|
|
} |
|
|
|
|
@ -739,48 +758,62 @@ string Window::OmitBBCodes(const string &str) |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int Window::RealLength(const string &str) |
|
|
|
|
size_t Window::RealLength(const string &s) |
|
|
|
|
{ |
|
|
|
|
if (str.empty()) |
|
|
|
|
if (s.empty()) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
bool collect = false; |
|
|
|
|
int length = 0; |
|
|
|
|
|
|
|
|
|
#ifdef UTF8_ENABLED |
|
|
|
|
wstring str2 = ToWString(str); |
|
|
|
|
# ifdef UTF8_ENABLED |
|
|
|
|
wstring ws = ToWString(s); |
|
|
|
|
wstring tmp; |
|
|
|
|
#else |
|
|
|
|
const string &str2 = str; |
|
|
|
|
# else |
|
|
|
|
const string &ws = s; |
|
|
|
|
string tmp; |
|
|
|
|
#endif |
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < str2.length(); i++, length++) |
|
|
|
|
for (int i = 0; i < ws.length(); i++, length++) |
|
|
|
|
{ |
|
|
|
|
if (str2[i] == '[' && (str2[i+1] == '.' || str2[i+1] == '/')) |
|
|
|
|
if (ws[i] == '[' && (ws[i+1] == '.' || ws[i+1] == '/')) |
|
|
|
|
collect = 1; |
|
|
|
|
|
|
|
|
|
if (collect) |
|
|
|
|
{ |
|
|
|
|
if (str2[i] != '[') |
|
|
|
|
tmp += str2[i]; |
|
|
|
|
if (ws[i] != '[') |
|
|
|
|
tmp += ws[i]; |
|
|
|
|
else |
|
|
|
|
tmp = str2[i]; |
|
|
|
|
tmp = ws[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (str2[i] == ']') |
|
|
|
|
if (ws[i] == ']') |
|
|
|
|
collect = 0; |
|
|
|
|
|
|
|
|
|
if (!collect && !tmp.empty()) |
|
|
|
|
{ |
|
|
|
|
if (isdigit(tmp[2]) || IsValidColor(TO_STRING(tmp))) |
|
|
|
|
{ |
|
|
|
|
# ifdef UTF8_ENABLED |
|
|
|
|
length -= Length(tmp); |
|
|
|
|
# else |
|
|
|
|
length -= tmp.length(); |
|
|
|
|
# endif |
|
|
|
|
} |
|
|
|
|
tmp.clear(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return length; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t Window::Length(const wstring &ws) |
|
|
|
|
{ |
|
|
|
|
size_t length = 0; |
|
|
|
|
for (wstring::const_iterator it = ws.begin(); it != ws.end(); it++) |
|
|
|
|
length += wcwidth(*it); |
|
|
|
|
return length; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*int CountBBCodes(const string &str)
|
|
|
|
|
{ |
|
|
|
|
if (str.empty()) |
|
|
|
|
|