Sha256: 74d84b7905252ea15f81639dc89cc9783e2ce20c9600a58c9b85c6d6bf19bcf4
Contents?: true
Size: 1.87 KB
Versions: 1
Compression:
Stored size: 1.87 KB
Contents
#ifndef GOSIMPL_ICONV_HPP #define GOSIMPL_ICONV_HPP #include <Gosu/Platform.hpp> #ifdef __APPLE__ // We want Apple's iconv #include </usr/include/iconv.h> #else #include <iconv.h> #endif #include <errno.h> namespace Gosu { template<typename Out, const char* to, const char* from, typename In> Out iconvert(const In& in) { if (in.empty()) return Out(); const size_t bufferLen = 128; typedef typename In::value_type InElem; typedef typename Out::value_type OutElem; static iconv_t cd = iconv_open(to, from); Out result; OutElem buffer[bufferLen]; char* inbuf = const_cast<char*>(reinterpret_cast<const char*>(&in[0])); size_t inbytesleft = in.size() * sizeof(InElem); char* outbuf = reinterpret_cast<char*>(buffer); size_t outbytesleft = sizeof buffer; for (;;) { size_t ret = ::iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (ret == static_cast<size_t>(-1) && errno == EILSEQ) { // Skip illegal sequence part, repeat loop. // TODO: Or retry w/ different encoding? ++inbuf; --inbytesleft; } else if (ret == static_cast<size_t>(-1) && errno == E2BIG) { // Append new characters, reset out buffer, then repeat loop. result.insert(result.end(), buffer, buffer + bufferLen); outbuf = reinterpret_cast<char*>(buffer); outbytesleft = sizeof buffer; } else { // Append what's new in the buffer, then LEAVE loop. result.insert(result.end(), buffer, buffer + bufferLen - outbytesleft / sizeof(OutElem)); return result; } } } } #endif
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
gosu-0.7.12 | GosuImpl/Iconv.hpp |