in src/main/cpp/simpledateformat.cpp [117:187]
static void renderFacet(const std::locale* locale,
incrementFunction inc,
char spec,
unsigned int wspec,
const char* aprspec,
std::vector<LogString>& values)
{
std::vector<LogString>::iterator valueIter = values.begin();
tm time;
memset(&time, 0, sizeof(time));
apr_time_exp_t aprtime;
memset(&aprtime, 0, sizeof(aprtime));
#if LOG4CXX_HAS_STD_LOCALE
if (locale != NULL)
{
#if LOG4CXX_WCHAR_T_API
if (HAS_FACET(*locale, std::time_put<wchar_t>))
{
const std::time_put<wchar_t>& facet = USE_FACET(*locale, std::time_put<wchar_t>);
size_t start = 0;
std::basic_ostringstream<wchar_t> os;
for (; valueIter != values.end(); valueIter++)
{
PUT_FACET(facet, os, &time, (char)wspec);
Transcoder::decode(os.str().substr(start), *valueIter);
start = os.str().length();
(*inc)(time, aprtime);
}
}
else
#endif
if (HAS_FACET(*locale, std::time_put<char>))
{
const std::time_put<char>& facet = USE_FACET(*locale, std::time_put<char> );
size_t start = 0;
std::ostringstream os;
for (; valueIter != values.end(); valueIter++)
{
PUT_FACET(facet, os, &time, spec);
Transcoder::decode(os.str().substr(start), *valueIter);
start = os.str().length();
(*inc)(time, aprtime);
}
}
}
#endif
const size_t BUFSIZE = 256;
char buf[BUFSIZE];
memset(buf, 0, BUFSIZE);
apr_size_t retsize = 0;
for (; valueIter != values.end(); valueIter++)
{
apr_status_t stat = apr_strftime(buf, &retsize, BUFSIZE, aprspec, &aprtime);
(*inc)(time, aprtime);
if (stat == APR_SUCCESS)
{
Transcoder::decode(std::string(buf, retsize), *valueIter);
}
else
{
valueIter->append(1, (logchar) 0x3F);
}
}
}