1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-07 00:45:32 +00:00

disabled char encoding method for windows, although you'll need to add the iconv libs

This commit is contained in:
Armin Preiml 2010-08-08 10:07:02 +02:00
parent 052d049a6c
commit 305563e595
2 changed files with 84 additions and 72 deletions

View file

@ -14,6 +14,11 @@ IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
SET(ICONV_FIND_QUIETLY TRUE) SET(ICONV_FIND_QUIETLY TRUE)
ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
IF(WIN32)
SET(ICONV_INCLUDE_DIR $ENV{ICONV_INCLUDE_DIR})
SET(ICONV_LIBRARIES $ENV{ICONV_LIBRARIES})
ENDIF(WIN32)
FIND_PATH(ICONV_INCLUDE_DIR iconv.h) FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c) FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c)

View file

@ -9,7 +9,10 @@
#include <sstream> #include <sstream>
#include <iomanip> #include <iomanip>
#include <errno.h> #include <errno.h>
#include <iconv.h>
#ifndef __WIN32__
#include <iconv.h>
#endif
#include <libs/mangle/stream/stream.hpp> #include <libs/mangle/stream/stream.hpp>
#include <libs/mangle/stream/servers/file_stream.hpp> #include <libs/mangle/stream/servers/file_stream.hpp>
@ -619,12 +622,15 @@ public:
} }
// Convert a string from the encoding used by Morrowind to UTF-8 // Convert a string from the encoding used by Morrowind to UTF-8
std::string convertToUTF8(std::string input) std::string convertToUTF8 (std::string input)
{ {
#ifdef __WIN32__
return input;
#else
std::string output = ""; std::string output = "";
//create convert description //create convert description
iconv_t cd = iconv_open("UTF-8", "WINDOWS-1252"); iconv_t cd = iconv_open ("UTF-8", "WINDOWS-1252");
if (cd == (iconv_t)-1) //error handling if (cd == (iconv_t)-1) //error handling
{ {
@ -645,7 +651,7 @@ public:
errMsg += "Unknown Error\n"; errMsg += "Unknown Error\n";
} }
fail(errMsg); fail (errMsg);
} }
else else
@ -655,7 +661,7 @@ public:
if (inputSize) //input is not empty if (inputSize) //input is not empty
{ {
//convert function doesn't accept const char *, therefore copy content into an char * //convert function doesn't accept const char *, therefore copy content into an char *
std::vector<char> inputBuffer(input.begin(), input.end()); std::vector<char> inputBuffer (input.begin(), input.end());
char *inputBufferBegin = &inputBuffer[0]; char *inputBufferBegin = &inputBuffer[0];
size_t inputBytesLeft = inputSize; //bytes to convert size_t inputBytesLeft = inputSize; //bytes to convert
@ -666,33 +672,33 @@ public:
char outputBuffer[outputSize]; char outputBuffer[outputSize];
char *outputBufferBegin; char *outputBufferBegin;
while (inputBytesLeft > 0 ) while (inputBytesLeft > 0)
{ {
outputBytesLeft = outputSize; outputBytesLeft = outputSize;
outputBufferBegin = outputBuffer; outputBufferBegin = outputBuffer;
if (iconv(cd, &inputBufferBegin, &inputBytesLeft, &outputBufferBegin, &outputBytesLeft) == (size_t)-1) if (iconv (cd, &inputBufferBegin, &inputBytesLeft, &outputBufferBegin, &outputBytesLeft) == (size_t)-1)
{ {
switch (errno) switch (errno)
{ {
case E2BIG: //outputBuffer is full case E2BIG: //outputBuffer is full
output += std::string(outputBuffer, outputSize); output += std::string (outputBuffer, outputSize);
break; break;
case EILSEQ: case EILSEQ:
fail("Iconv: Invalid multibyte sequence.\n"); fail ("Iconv: Invalid multibyte sequence.\n");
break; break;
case EINVAL: case EINVAL:
fail("Iconv: Incomplete multibyte sequence.\n"); fail ("Iconv: Incomplete multibyte sequence.\n");
break; break;
default: default:
fail("Iconv: Unknown Error\n"); fail ("Iconv: Unknown Error\n");
} }
} }
} }
//read only relevant bytes from outputBuffer //read only relevant bytes from outputBuffer
output += std::string(outputBuffer, outputSize - outputBytesLeft); output += std::string (outputBuffer, outputSize - outputBytesLeft);
} }
} }
@ -701,6 +707,7 @@ public:
return output; return output;
} }
#endif
void skip(int bytes) { esm->seek(esm->tell()+bytes); } void skip(int bytes) { esm->seek(esm->tell()+bytes); }
uint64_t getOffset() { return esm->tell(); } uint64_t getOffset() { return esm->tell(); }