Skip to content
Permalink
Browse files
Seems like the VC++ string::push_back is pretty terrible
  • Loading branch information
rygorous committed Jan 28, 2013
1 parent d384830 commit 5965031
Showing 1 changed file with 16 additions and 4 deletions.
@@ -87,18 +87,30 @@ static const char *FindLast(const char *start, const char *end, char ch)
static void AssignStr(cString &dest, const char *start, const char *end, _locale_t locale)
{
dest.clear();
dest.reserve(end - start); // assume most characters are 1-byte
if (end <= start)
return;

static const int NBUF = 64;
wchar_t buf[NBUF];
int nb = 0;

size_t len = end - start;
size_t initial = len + 1; // assume most characters are 1-byte
dest.reserve(initial);

const char *p = start;
while (p < end)
{
wchar_t wc;
int len = _mbtowc_l(&wc, p, end - p, locale);
int len = _mbtowc_l(&buf[nb++], p, end - p, locale);
if (len < 1)
break;

dest.push_back(wc);
p += len;
if (p >= end || nb >= NBUF)
{
dest.append(buf, nb);
nb = 0;
}
}
}

0 comments on commit 5965031

Please sign in to comment.