X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=odcread.cc;h=fc210a8a10c59f5cc0e0660a711a702114b2bc9e;hb=31034b9704565140db20590413300b950bfead83;hp=858028e6babf5e252ede8ade0c0f71d2946ceb4e;hpb=41d9c65ec79728a8771cd2288dfc3458569c6801;p=odcread.git diff --git a/odcread.cc b/odcread.cc index 858028e..fc210a8 100644 --- a/odcread.cc +++ b/odcread.cc @@ -9,6 +9,12 @@ #include #include +// Character encoding conversions +#include +#include +#include +#include + namespace odc { class Context { public: @@ -80,14 +86,64 @@ namespace odc { virtual void foldRight() { terminateContext(); } + char *getCharSet() { + return "UTF-8"; // FIXME setlocale(LC_CTYPE, 0) + processing + } virtual void textShortPiece(const ShortPiece *piece) { - std::string text = piece->getText(); - d_context.top()->addPiece(text); + iconv_t conv = iconv_open("UTF-8", "ISO-8859-1"); + if (conv == (iconv_t)-1) { + std::string str("iconv initialization error: "); + str += strerror(errno); + throw str.c_str(); + } + size_t bytesIn = piece->size() + 1; + SHORTCHAR *in = piece->getBuffer(); + size_t bytesOut = bytesIn; // FIXME probably not safe. + char *out = new char[bytesIn]; + char *outPtr = out; + size_t rval = iconv(conv, &in, &bytesIn, &outPtr, &bytesOut); + if (rval == (size_t)-1) { + std::string str("iconv error: "); + str += strerror(errno); + throw str.c_str(); + } + iconv_close(conv); + std::string str(out); + for (std::string::iterator it = str.begin(); it < str.end(); ++it) { + if (*it == '\r') *it = '\n'; + } + d_context.top()->addPiece(str); } virtual void textLongPiece(const LongPiece *piece) { - throw "Long Piece not handled"; - //std::string text = piece->getText(); - //d_context.top()->addPiece(text); + /* + char *out = (char*)piece->getBuffer(); + std::string str(out); + d_context.top()->addPiece(str); + */ + //d_convLong = iconv_open(setlocale(LC_CTYPE, 0), "UCS-2"); + iconv_t conv = iconv_open("UTF-8", "UCS-2"); + if (conv == (iconv_t)-1) { + std::string str("iconv initialization error: "); + str += strerror(errno); + throw str.c_str(); + } + size_t bytesIn = piece->size() + 2; + char *in = (char*)piece->getBuffer(); + size_t bytesOut = bytesIn; // FIXME probably not safe. + char *out = new char[bytesIn]; + char *outPtr = out; + size_t rval = iconv(conv, &in, &bytesIn, &outPtr, &bytesOut); + if (rval == (size_t)-1) { + std::string str("iconv error: "); + str += strerror(errno); + throw str.c_str(); + } + iconv_close(conv); + std::string str(out); + for (std::string::iterator it = str.begin(); it < str.end(); ++it) { + if (*it == '\r') *it = '\n'; + } + d_context.top()->addPiece(str); } }; @@ -112,6 +168,10 @@ int main(int argc, char *argv[]) { if (argc < 2) { return 1; } + + // Set the locale according to the terminal's environment + setlocale(LC_ALL, ""); + std::ifstream in(argv[1], std::ios::in | std::ios::binary); odc::Store* s;