\r
\r
/* ************************************************************************** *\r
- \r
+\r
STRLCPY(3) OpenBSD Programmer's Manual STRLCPY(3)\r
\r
NAME\r
template <class T>\r
static inline size_t xstrlcpy(T *o_dest, const T *i_src, size_t i_destSize)\r
{\r
- T *d = o_dest;\r
- const T *s = i_src;\r
- size_t n = i_destSize;\r
-\r
- ASSERT( o_dest != NULL );\r
- ASSERT( i_src != NULL );\r
-\r
- // Copy as many bytes as will fit\r
- if (n != 0 && --n != 0)\r
- {\r
- do\r
- {\r
- if ((*d++ = *s++) == 0)\r
- break;\r
- } while (--n != 0);\r
- }\r
-\r
- // Not enough room in o_dest, add NUL and traverse rest of i_src\r
- if (n == 0)\r
- {\r
- if (i_destSize != 0)\r
- *d = T(); // NUL-terminate o_dest\r
- while (*s++)\r
- ;\r
- }\r
-\r
- return (s - i_src - 1); // count does not include NUL\r
+ T *d = o_dest;\r
+ const T *s = i_src;\r
+ size_t n = i_destSize;\r
+\r
+ ASSERT( o_dest != NULL );\r
+ ASSERT( i_src != NULL );\r
+\r
+ // Copy as many bytes as will fit\r
+ if (n != 0 && --n != 0) {\r
+ do {\r
+ if ((*d++ = *s++) == 0)\r
+ break;\r
+ } while (--n != 0);\r
+ }\r
+\r
+ // Not enough room in o_dest, add NUL and traverse rest of i_src\r
+ if (n == 0) {\r
+ if (i_destSize != 0)\r
+ *d = T(); // NUL-terminate o_dest\r
+ while (*s++)\r
+ ;\r
+ }\r
+\r
+ return (s - i_src - 1); // count does not include NUL\r
}\r
\r
\r
// copy\r
size_t strlcpy(char *o_dest, const char *i_src, size_t i_destSize)\r
{\r
- return xstrlcpy(o_dest, i_src, i_destSize);\r
+ return xstrlcpy(o_dest, i_src, i_destSize);\r
}\r
\r
\r
// copy\r
size_t wcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize)\r
{\r
- return xstrlcpy(o_dest, i_src, i_destSize);\r
+ return xstrlcpy(o_dest, i_src, i_destSize);\r
}\r
\r
\r
-// copy \r
+// copy\r
size_t mbslcpy(unsigned char *o_dest, const unsigned char *i_src,\r
- size_t i_destSize)\r
+ size_t i_destSize)\r
{\r
- unsigned char *d = o_dest;\r
- const unsigned char *s = i_src;\r
- size_t n = i_destSize;\r
-\r
- ASSERT( o_dest != NULL );\r
- ASSERT( i_src != NULL );\r
-\r
- if (n == 0)\r
- return strlen(reinterpret_cast<const char *>(i_src));\r
- \r
- // Copy as many bytes as will fit\r
- for (-- n; *s && 0 < n; -- n)\r
- {\r
- if (_ismbblead(*s))\r
- {\r
- if (!(s[1] && 2 <= n))\r
- break;\r
- *d++ = *s++;\r
- -- n;\r
- }\r
- *d++ = *s++;\r
- }\r
- *d = '\0';\r
-\r
- for (; *s; ++ s)\r
- ;\r
- \r
- return s - i_src;\r
+ unsigned char *d = o_dest;\r
+ const unsigned char *s = i_src;\r
+ size_t n = i_destSize;\r
+\r
+ ASSERT( o_dest != NULL );\r
+ ASSERT( i_src != NULL );\r
+\r
+ if (n == 0)\r
+ return strlen(reinterpret_cast<const char *>(i_src));\r
+\r
+ // Copy as many bytes as will fit\r
+ for (-- n; *s && 0 < n; -- n) {\r
+ if (_ismbblead(*s)) {\r
+ if (!(s[1] && 2 <= n))\r
+ break;\r
+ *d++ = *s++;\r
+ -- n;\r
+ }\r
+ *d++ = *s++;\r
+ }\r
+ *d = '\0';\r
+\r
+ for (; *s; ++ s)\r
+ ;\r
+\r
+ return s - i_src;\r
}\r
\r
\r
/// stream output\r
tostream &operator<<(tostream &i_ost, const tstringq &i_data)\r
{\r
- i_ost << _T("\"");\r
- for (const _TCHAR *s = i_data.c_str(); *s; ++ s)\r
- {\r
- switch (*s)\r
- {\r
- case _T('\a'): i_ost << _T("\\a"); break;\r
- case _T('\f'): i_ost << _T("\\f"); break;\r
- case _T('\n'): i_ost << _T("\\n"); break;\r
- case _T('\r'): i_ost << _T("\\r"); break;\r
- case _T('\t'): i_ost << _T("\\t"); break;\r
- case _T('\v'): i_ost << _T("\\v"); break;\r
- case _T('"'): i_ost << _T("\\\""); break;\r
- default:\r
- if (_istlead(*s))\r
- {\r
- _TCHAR buf[3] = { s[0], s[1], 0 };\r
- i_ost << buf;\r
- ++ s;\r
- }\r
- else if (_istprint(*s))\r
- {\r
- _TCHAR buf[2] = { *s, 0 };\r
- i_ost << buf;\r
- }\r
- else\r
- {\r
- i_ost << _T("\\x");\r
- _TCHAR buf[5];\r
+ i_ost << _T("\"");\r
+ for (const _TCHAR *s = i_data.c_str(); *s; ++ s) {\r
+ switch (*s) {\r
+ case _T('\a'):\r
+ i_ost << _T("\\a");\r
+ break;\r
+ case _T('\f'):\r
+ i_ost << _T("\\f");\r
+ break;\r
+ case _T('\n'):\r
+ i_ost << _T("\\n");\r
+ break;\r
+ case _T('\r'):\r
+ i_ost << _T("\\r");\r
+ break;\r
+ case _T('\t'):\r
+ i_ost << _T("\\t");\r
+ break;\r
+ case _T('\v'):\r
+ i_ost << _T("\\v");\r
+ break;\r
+ case _T('"'):\r
+ i_ost << _T("\\\"");\r
+ break;\r
+ default:\r
+ if (_istlead(*s)) {\r
+ _TCHAR buf[3] = { s[0], s[1], 0 };\r
+ i_ost << buf;\r
+ ++ s;\r
+ } else if (_istprint(*s)) {\r
+ _TCHAR buf[2] = { *s, 0 };\r
+ i_ost << buf;\r
+ } else {\r
+ i_ost << _T("\\x");\r
+ _TCHAR buf[5];\r
#ifdef _UNICODE\r
- _sntprintf(buf, NUMBER_OF(buf), _T("%04x"), *s);\r
+ _sntprintf(buf, NUMBER_OF(buf), _T("%04x"), *s);\r
#else\r
- _sntprintf(buf, NUMBER_OF(buf), _T("%02x"), *s);\r
+ _sntprintf(buf, NUMBER_OF(buf), _T("%02x"), *s);\r
#endif\r
- i_ost << buf;\r
+ i_ost << buf;\r
+ }\r
+ break;\r
+ }\r
}\r
- break;\r
- }\r
- }\r
- i_ost << _T("\"");\r
- return i_ost;\r
+ i_ost << _T("\"");\r
+ return i_ost;\r
}\r
\r
\r
// interpret meta characters such as \n\r
tstring interpretMetaCharacters(const _TCHAR *i_str, size_t i_len,\r
- const _TCHAR *i_quote,\r
- bool i_doesUseRegexpBackReference)\r
+ const _TCHAR *i_quote,\r
+ bool i_doesUseRegexpBackReference)\r
{\r
- // interpreted string is always less than i_len\r
- Array<_TCHAR> result(i_len + 1);\r
- // destination\r
- _TCHAR *d = result.get();\r
- // end pointer\r
- const _TCHAR *end = i_str + i_len;\r
- \r
- while (i_str < end && *i_str)\r
- {\r
- if (*i_str != _T('\\'))\r
- {\r
- if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)\r
- *d++ = *i_str++;\r
- *d++ = *i_str++;\r
- }\r
- else if (*(i_str + 1) != _T('\0'))\r
- {\r
- i_str ++;\r
- if (i_quote && _tcschr(i_quote, *i_str))\r
- *d++ = *i_str++;\r
- else\r
- switch (*i_str)\r
- {\r
- case _T('a'): *d++ = _T('\x07'); i_str ++; break;\r
- //case _T('b'): *d++ = _T('\b'); i_str ++; break;\r
- case _T('e'): *d++ = _T('\x1b'); i_str ++; break;\r
- case _T('f'): *d++ = _T('\f'); i_str ++; break;\r
- case _T('n'): *d++ = _T('\n'); i_str ++; break;\r
- case _T('r'): *d++ = _T('\r'); i_str ++; break;\r
- case _T('t'): *d++ = _T('\t'); i_str ++; break;\r
- case _T('v'): *d++ = _T('\v'); i_str ++; break;\r
- //case _T('?'): *d++ = _T('\x7f'); i_str ++; break;\r
- //case _T('_'): *d++ = _T(' '); i_str ++; break;\r
- //case _T('\\'): *d++ = _T('\\'); i_str ++; break;\r
- case _T('\''): *d++ = _T('\''); i_str ++; break;\r
- case _T('"'): *d++ = _T('"'); i_str ++; break;\r
- case _T('\\'): *d++ = _T('\\'); i_str ++; break;\r
- case _T('c'): // control code, for example '\c[' is escape: '\x1b'\r
- i_str ++;\r
- if (i_str < end && *i_str)\r
- {\r
- static const _TCHAR *ctrlchar =\r
- _T("@ABCDEFGHIJKLMNO")\r
- _T("PQRSTUVWXYZ[\\]^_")\r
- _T("@abcdefghijklmno")\r
- _T("pqrstuvwxyz@@@@?");\r
- static const _TCHAR *ctrlcode =\r
- _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")\r
- _T("\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37")\r
- _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")\r
- _T("\20\21\22\23\24\25\26\27\30\31\32\00\00\00\00\177");\r
- if (const _TCHAR *c = _tcschr(ctrlchar, *i_str))\r
- *d++ = ctrlcode[c - ctrlchar], i_str ++;\r
- }\r
- break;\r
- case _T('x'): case _T('X'):\r
- {\r
- i_str ++;\r
- static const _TCHAR *hexchar = _T("0123456789ABCDEFabcdef");\r
- static int hexvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, 8, 9,\r
- 10, 11, 12, 13, 14, 15,\r
- 10, 11, 12, 13, 14, 15, };\r
- bool brace = false;\r
- if (i_str < end && *i_str == _T('{'))\r
- {\r
- i_str ++;\r
- brace = true;\r
- }\r
- int n = 0;\r
- for (; i_str < end && *i_str; i_str ++)\r
- if (const _TCHAR *c = _tcschr(hexchar, *i_str))\r
- n = n * 16 + hexvalue[c - hexchar];\r
- else\r
- break;\r
- if (i_str < end && *i_str == _T('}') && brace)\r
- i_str ++;\r
- if (0 < n)\r
- *d++ = static_cast<_TCHAR>(n);\r
- break;\r
- }\r
- case _T('1'): case _T('2'): case _T('3'):\r
- case _T('4'): case _T('5'): case _T('6'): case _T('7'):\r
- if (i_doesUseRegexpBackReference)\r
- goto case_default;\r
- // fall through\r
- case _T('0'):\r
- {\r
- static const _TCHAR *octalchar = _T("01234567");\r
- static int octalvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, };\r
- int n = 0;\r
- for (; i_str < end && *i_str; i_str ++)\r
- if (const _TCHAR *c = _tcschr(octalchar, *i_str))\r
- n = n * 8 + octalvalue[c - octalchar];\r
- else\r
- break;\r
- if (0 < n)\r
- *d++ = static_cast<_TCHAR>(n);\r
- break;\r
- }\r
- default:\r
- case_default:\r
- *d++ = _T('\\');\r
- if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)\r
- *d++ = *i_str++;\r
- *d++ = *i_str++;\r
- break;\r
+ // interpreted string is always less than i_len\r
+ Array<_TCHAR> result(i_len + 1);\r
+ // destination\r
+ _TCHAR *d = result.get();\r
+ // end pointer\r
+ const _TCHAR *end = i_str + i_len;\r
+\r
+ while (i_str < end && *i_str) {\r
+ if (*i_str != _T('\\')) {\r
+ if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)\r
+ *d++ = *i_str++;\r
+ *d++ = *i_str++;\r
+ } else if (*(i_str + 1) != _T('\0')) {\r
+ i_str ++;\r
+ if (i_quote && _tcschr(i_quote, *i_str))\r
+ *d++ = *i_str++;\r
+ else\r
+ switch (*i_str) {\r
+ case _T('a'):\r
+ *d++ = _T('\x07');\r
+ i_str ++;\r
+ break;\r
+ //case _T('b'): *d++ = _T('\b'); i_str ++; break;\r
+ case _T('e'):\r
+ *d++ = _T('\x1b');\r
+ i_str ++;\r
+ break;\r
+ case _T('f'):\r
+ *d++ = _T('\f');\r
+ i_str ++;\r
+ break;\r
+ case _T('n'):\r
+ *d++ = _T('\n');\r
+ i_str ++;\r
+ break;\r
+ case _T('r'):\r
+ *d++ = _T('\r');\r
+ i_str ++;\r
+ break;\r
+ case _T('t'):\r
+ *d++ = _T('\t');\r
+ i_str ++;\r
+ break;\r
+ case _T('v'):\r
+ *d++ = _T('\v');\r
+ i_str ++;\r
+ break;\r
+ //case _T('?'): *d++ = _T('\x7f'); i_str ++; break;\r
+ //case _T('_'): *d++ = _T(' '); i_str ++; break;\r
+ //case _T('\\'): *d++ = _T('\\'); i_str ++; break;\r
+ case _T('\''):\r
+ *d++ = _T('\'');\r
+ i_str ++;\r
+ break;\r
+ case _T('"'):\r
+ *d++ = _T('"');\r
+ i_str ++;\r
+ break;\r
+ case _T('\\'):\r
+ *d++ = _T('\\');\r
+ i_str ++;\r
+ break;\r
+ case _T('c'): // control code, for example '\c[' is escape: '\x1b'\r
+ i_str ++;\r
+ if (i_str < end && *i_str) {\r
+ static const _TCHAR *ctrlchar =\r
+ _T("@ABCDEFGHIJKLMNO")\r
+ _T("PQRSTUVWXYZ[\\]^_")\r
+ _T("@abcdefghijklmno")\r
+ _T("pqrstuvwxyz@@@@?");\r
+ static const _TCHAR *ctrlcode =\r
+ _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")\r
+ _T("\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37")\r
+ _T("\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17")\r
+ _T("\20\21\22\23\24\25\26\27\30\31\32\00\00\00\00\177");\r
+ if (const _TCHAR *c = _tcschr(ctrlchar, *i_str))\r
+ *d++ = ctrlcode[c - ctrlchar], i_str ++;\r
+ }\r
+ break;\r
+ case _T('x'):\r
+ case _T('X'): {\r
+ i_str ++;\r
+ static const _TCHAR *hexchar = _T("0123456789ABCDEFabcdef");\r
+ static int hexvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, 8, 9,\r
+ 10, 11, 12, 13, 14, 15,\r
+ 10, 11, 12, 13, 14, 15,\r
+ };\r
+ bool brace = false;\r
+ if (i_str < end && *i_str == _T('{')) {\r
+ i_str ++;\r
+ brace = true;\r
+ }\r
+ int n = 0;\r
+ for (; i_str < end && *i_str; i_str ++)\r
+ if (const _TCHAR *c = _tcschr(hexchar, *i_str))\r
+ n = n * 16 + hexvalue[c - hexchar];\r
+ else\r
+ break;\r
+ if (i_str < end && *i_str == _T('}') && brace)\r
+ i_str ++;\r
+ if (0 < n)\r
+ *d++ = static_cast<_TCHAR>(n);\r
+ break;\r
+ }\r
+ case _T('1'):\r
+ case _T('2'):\r
+ case _T('3'):\r
+ case _T('4'):\r
+ case _T('5'):\r
+ case _T('6'):\r
+ case _T('7'):\r
+ if (i_doesUseRegexpBackReference)\r
+ goto case_default;\r
+ // fall through\r
+ case _T('0'): {\r
+ static const _TCHAR *octalchar = _T("01234567");\r
+ static int octalvalue[] = { 0, 1, 2, 3, 4, 5 ,6, 7, };\r
+ int n = 0;\r
+ for (; i_str < end && *i_str; i_str ++)\r
+ if (const _TCHAR *c = _tcschr(octalchar, *i_str))\r
+ n = n * 8 + octalvalue[c - octalchar];\r
+ else\r
+ break;\r
+ if (0 < n)\r
+ *d++ = static_cast<_TCHAR>(n);\r
+ break;\r
+ }\r
+ default:\r
+case_default:\r
+ *d++ = _T('\\');\r
+ if (_istlead(*i_str) && *(i_str + 1) && i_str + 1 < end)\r
+ *d++ = *i_str++;\r
+ *d++ = *i_str++;\r
+ break;\r
+ }\r
+ }\r
}\r
- }\r
- }\r
- *d =_T('\0');\r
- return result.get();\r
+ *d =_T('\0');\r
+ return result.get();\r
}\r
\r
\r
// add session id to i_str\r
tstring addSessionId(const _TCHAR *i_str)\r
{\r
- DWORD sessionId;\r
- tstring s(i_str);\r
- if (ProcessIdToSessionId(GetCurrentProcessId(), &sessionId)) {\r
- _TCHAR buf[20];\r
- _sntprintf(buf, NUMBER_OF(buf), _T("%u"), sessionId);\r
- s += buf;\r
- }\r
- return s;\r
+ DWORD sessionId;\r
+ tstring s(i_str);\r
+ if (ProcessIdToSessionId(GetCurrentProcessId(), &sessionId)) {\r
+ _TCHAR buf[20];\r
+ _sntprintf(buf, NUMBER_OF(buf), _T("%u"), sessionId);\r
+ s += buf;\r
+ }\r
+ return s;\r
}\r
\r
\r
// escape regexp special characters in MBCS trail bytes\r
std::string guardRegexpFromMbcs(const char *i_str)\r
{\r
- size_t len = strlen(i_str);\r
- Array<char> buf(len * 2 + 1);\r
- char *p = buf.get();\r
- while (*i_str)\r
- {\r
- if (_ismbblead(static_cast<u_char>(*i_str)) && i_str[1])\r
- {\r
- *p ++ = *i_str ++;\r
- if (strchr(".*?+(){}[]^$", *i_str))\r
- *p ++ = '\\';\r
- }\r
- *p ++ = *i_str ++;\r
- }\r
- return std::string(buf.get(), p);\r
+ size_t len = strlen(i_str);\r
+ Array<char> buf(len * 2 + 1);\r
+ char *p = buf.get();\r
+ while (*i_str) {\r
+ if (_ismbblead(static_cast<u_char>(*i_str)) && i_str[1]) {\r
+ *p ++ = *i_str ++;\r
+ if (strchr(".*?+(){}[]^$", *i_str))\r
+ *p ++ = '\\';\r
+ }\r
+ *p ++ = *i_str ++;\r
+ }\r
+ return std::string(buf.get(), p);\r
}\r
#endif // !_MBCS\r
\r
// converter\r
std::wstring to_wstring(const std::string &i_str)\r
{\r
- size_t size = mbstowcs(NULL, i_str.c_str(), i_str.size() + 1);\r
- if (size == (size_t)-1)\r
- return std::wstring();\r
- Array<wchar_t> result(size + 1);\r
- mbstowcs(result.get(), i_str.c_str(), i_str.size() + 1);\r
- return std::wstring(result.get());\r
+ size_t size = mbstowcs(NULL, i_str.c_str(), i_str.size() + 1);\r
+ if (size == (size_t)-1)\r
+ return std::wstring();\r
+ Array<wchar_t> result(size + 1);\r
+ mbstowcs(result.get(), i_str.c_str(), i_str.size() + 1);\r
+ return std::wstring(result.get());\r
}\r
\r
\r
// converter\r
std::string to_string(const std::wstring &i_str)\r
{\r
- size_t size = wcstombs(NULL, i_str.c_str(), i_str.size() + 1);\r
- if (size == (size_t)-1)\r
- return std::string();\r
- Array<char> result(size + 1);\r
- wcstombs(result.get(), i_str.c_str(), i_str.size() + 1);\r
- return std::string(result.get());\r
+ size_t size = wcstombs(NULL, i_str.c_str(), i_str.size() + 1);\r
+ if (size == (size_t)-1)\r
+ return std::string();\r
+ Array<char> result(size + 1);\r
+ wcstombs(result.get(), i_str.c_str(), i_str.size() + 1);\r
+ return std::string(result.get());\r
}\r
\r
\r
/// stream output\r
tostream &operator<<(tostream &i_ost, const tregex &i_data)\r
{\r
- return i_ost << i_data.str();\r
+ return i_ost << i_data.str();\r
}\r
\r
\r
/// get lower string\r
tstring toLower(const tstring &i_str)\r
{\r
- tstring str(i_str);\r
- for (size_t i = 0; i < str.size(); ++ i)\r
- {\r
- if (_ismbblead(str[i]))\r
- ++ i;\r
- else\r
- str[i] = tolower(str[i]);\r
- }\r
- return str;\r
+ tstring str(i_str);\r
+ for (size_t i = 0; i < str.size(); ++ i) {\r
+ if (_ismbblead(str[i]))\r
+ ++ i;\r
+ else\r
+ str[i] = tolower(str[i]);\r
+ }\r
+ return str;\r
}\r
\r
\r
// convert wstring to UTF-8\r
std::string to_UTF_8(const std::wstring &i_str)\r
{\r
- // 0xxxxxxx: 00-7F\r
- // 110xxxxx 10xxxxxx: 0080-07FF\r
- // 1110xxxx 10xxxxxx 10xxxxxx: 0800 - FFFF\r
-\r
- int size = 0;\r
- \r
- // count needed buffer size\r
- for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i)\r
- {\r
- if (0x0000 <= *i && *i <= 0x007f)\r
- size += 1;\r
- else if (0x0080 <= *i && *i <= 0x07ff)\r
- size += 2;\r
- else if (0x0800 <= *i && *i <= 0xffff)\r
- size += 3;\r
- }\r
-\r
- Array<char> result(size);\r
- int ri = 0;\r
- \r
- // make UTF-8\r
- for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i)\r
- {\r
- if (0x0000 <= *i && *i <= 0x007f)\r
- result[ri ++] = static_cast<char>(*i);\r
- else if (0x0080 <= *i && *i <= 0x07ff)\r
- {\r
- result[ri ++] = static_cast<char>(((*i & 0x0fc0) >> 6) | 0xc0);\r
- result[ri ++] = static_cast<char>(( *i & 0x003f ) | 0x80);\r
- }\r
- else if (0x0800 <= *i && *i <= 0xffff)\r
- {\r
- result[ri ++] = static_cast<char>(((*i & 0xf000) >> 12) | 0xe0);\r
- result[ri ++] = static_cast<char>(((*i & 0x0fc0) >> 6) | 0x80);\r
- result[ri ++] = static_cast<char>(( *i & 0x003f ) | 0x80);\r
- }\r
- }\r
-\r
- return std::string(result.begin(), result.end());\r
+ // 0xxxxxxx: 00-7F\r
+ // 110xxxxx 10xxxxxx: 0080-07FF\r
+ // 1110xxxx 10xxxxxx 10xxxxxx: 0800 - FFFF\r
+\r
+ int size = 0;\r
+\r
+ // count needed buffer size\r
+ for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i) {\r
+ if (0x0000 <= *i && *i <= 0x007f)\r
+ size += 1;\r
+ else if (0x0080 <= *i && *i <= 0x07ff)\r
+ size += 2;\r
+ else if (0x0800 <= *i && *i <= 0xffff)\r
+ size += 3;\r
+ }\r
+\r
+ Array<char> result(size);\r
+ int ri = 0;\r
+\r
+ // make UTF-8\r
+ for (std::wstring::const_iterator i = i_str.begin(); i != i_str.end(); ++ i) {\r
+ if (0x0000 <= *i && *i <= 0x007f)\r
+ result[ri ++] = static_cast<char>(*i);\r
+ else if (0x0080 <= *i && *i <= 0x07ff) {\r
+ result[ri ++] = static_cast<char>(((*i & 0x0fc0) >> 6) | 0xc0);\r
+ result[ri ++] = static_cast<char>(( *i & 0x003f ) | 0x80);\r
+ } else if (0x0800 <= *i && *i <= 0xffff) {\r
+ result[ri ++] = static_cast<char>(((*i & 0xf000) >> 12) | 0xe0);\r
+ result[ri ++] = static_cast<char>(((*i & 0x0fc0) >> 6) | 0x80);\r
+ result[ri ++] = static_cast<char>(( *i & 0x003f ) | 0x80);\r
+ }\r
+ }\r
+\r
+ return std::string(result.begin(), result.end());\r
}\r