/// convert wide char string to multibyte string bool WCSToMBS(behaviac::string& resultString, const behaviac::wstring& wstr, const char* locale) { BEHAVIAC_UNUSED_VAR(resultString); BEHAVIAC_UNUSED_VAR(wstr); BEHAVIAC_UNUSED_VAR(locale); bool ret = false; #if BEHAVIAC_COMPILER_MSVC const int cp = (strcmp(locale, LOCALE_CN_UTF8) == 0) ? CP_UTF8 : CP_ACP; const int dwNum = WideCharToMultiByte(cp, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); char* buffer = (char*)BEHAVIAC_MALLOC_WITHTAG(dwNum * 2 + 2, "WCSToMBS"); if (buffer) { WideCharToMultiByte(cp, 0, wstr.c_str(), -1, buffer, dwNum, NULL, NULL); resultString = buffer; BEHAVIAC_FREE(buffer); ret = true; } #else uint32_t dwNum = (wstr.size() + 1) * 4; char* buffer = (char*)BEHAVIAC_MALLOC_WITHTAG(dwNum, "WCSToMBS"); if (buffer) { //remember it to restore it later char* currrentLocale = setlocale(LC_ALL, 0); char* loc = setlocale(LC_ALL, locale); if (loc) { wcstombs(buffer, wstr.c_str(), dwNum); ret = true; } //restore setlocale(LC_ALL, currrentLocale); resultString = buffer; BEHAVIAC_FREE(buffer); } #endif//#if BEHAVIAC_COMPILER_MSVC return ret; }
char* LoadTextFileAsBuffer(const char* fileName) { char* returnedBuffer = NULL; IFile* fileHandle = behaviac::CFileManager::GetInstance()->FileOpen(fileName, CFileSystem::EOpenAccess_Read); if (fileHandle) { uint32_t fileSize = (uint32_t)fileHandle->GetSize(); char* fileBuffer = (char*)BEHAVIAC_MALLOC_WITHTAG(fileSize + 1, "TextFileBuffer"); if (fileHandle->Read(fileBuffer, fileSize) == fileSize) { fileBuffer[fileSize] = '\0'; returnedBuffer = fileBuffer; } else { BEHAVIAC_ASSERT(0, "Fail to read the text file : %s\n", fileName); } behaviac::CFileManager::GetInstance()->FileClose(fileHandle); } else { BEHAVIAC_ASSERT(0, "Fail to open the text file : %s\n", fileName); } return returnedBuffer; }
char* MakeStringName1(const char* aT1, const char* aT2) { size_t size = strlen(aT1) + strlen(aT2); char* str = (char*)BEHAVIAC_MALLOC_WITHTAG(size + 1, "CRTTIBase"); string_cpy(str, aT1); string_cat(str, aT2); return str; }
//! Parse xml from null terminated buffer. XmlNodeRef XmlParser::parseBuffer(const char* buffer, const char* rootNodeName) { size_t bufLen = strlen(buffer); char* temp = (char*)BEHAVIAC_MALLOC_WITHTAG(bufLen + 1, "XmlParserImp::parse"); memcpy(temp, buffer, bufLen); BEHAVIAC_ASSERT(temp[bufLen] == '\0'); XmlNodeRef result = this->parseBuffer(temp, (int)bufLen, rootNodeName); BEHAVIAC_FREE(temp); return result; }
XmlNodeRef XmlParser::parse(behaviac::IFile* file, const char* rootNodeName, const char* suffix, bool handleError) { BEHAVIAC_UNUSED_VAR(suffix); BEHAVIAC_UNUSED_VAR(handleError); m_errorString.clear(); XmlParserImp xml; if (file) { int iSize = (int)file->GetSize() - (int)file->Seek(0, behaviac::CFileSystem::ESeekMoveMode_Cur); if (iSize != 0) { static const int32_t ReadBlockSize = 64 * 1024; char* buf = (char*)BEHAVIAC_MALLOC_WITHTAG(ReadBlockSize, "XML"); XmlNodeRef ref; for (int32_t i = 0; i <= iSize / (ReadBlockSize); ++i) { int32_t bufSize = file->Read(buf, ReadBlockSize); { buf[bufSize] = '\0'; ref = xml.parse(buf, bufSize, rootNodeName, m_errorString, i == iSize / (ReadBlockSize)); } } BEHAVIAC_FREE(buf); if (handleError && !m_errorString.empty()) { BEHAVIAC_LOGWARNING("Error while parsing file\n\n%s", m_errorString.c_str()); } return ref; } else { return XmlNodeRef(); } } else { BEHAVIAC_ASSERT(0, "XmlParse(behaviac::IFile*) - Invalid file\n"); return XmlNodeRef(); } }
void CPathID::SetContentPrivate(const char* content) { if (content == NULL || content[0] == '\0') { m_value = InvalidID; #if STRINGID_USESTRINGCONTENT m_content = NULL; #endif } else { m_value = CRC32::CalcCRCNoCase(content); } #if STRINGID_USESTRINGCONTENT behaviac::Mutex s_cs; behaviac::ScopedLock lock(s_cs); StringIdDictionary& dictionary = GetDictionary(); StringIdDictionary::iterator it = dictionary.find(m_value); if (it != dictionary.end()) { if (string_icmp(content, (*it).second)) { BEHAVIAC_ASSERT(0, "There is a conflict between two PathID for the CRC 0x%08X.\n%s\n%s\n\nThe result of that is unpredictable but will probably crash.", m_value, content, (*it).second); } m_content = (*it).second; } else { uint32_t len = strlen(content); char* str = (char*)BEHAVIAC_MALLOC_WITHTAG(len + 1, "PathID"); string_cpy(str, content); dictionary[m_value] = str; m_content = str; } #endif }