1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-20 09:23:52 +00:00
openmw-tes3mp/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Guid.cpp
2010-07-08 00:23:28 +02:00

180 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
@file
@author Albert Semenov
@date 09/2008
@module
*/
/*
This file is part of MyGUI.
MyGUI is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyGUI is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
*/
#include "MyGUI_Precompiled.h"
#include "MyGUI_Guid.h"
#if MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX || MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE
#include <uuid/uuid.h>
#elif MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
#include <objbase.h>
#endif
namespace MyGUI
{
const char Guid::convert_hex[64] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 64, 64, 64, 64, 64, 64,
64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 10, 11, 12, 13, 14, 15, 64, 64, 64, 64, 64, 64, 64, 64, 64
};
Guid Guid::parse(const std::string& _value)
{
Guid ret;
size_t start=0;
// формат со скобками { ... }
if (_value.size() == 38)
{
start ++;
#if MYGUI_DEBUG_MODE == 1
if ((_value[0] != '{') || (_value[37] != '}'))
{
return ret;
}
#endif
}
// формат без скобок ...
else if (_value.size() != 36)
{
return ret;
}
#if MYGUI_DEBUG_MODE == 1
if ((_value[start + 8] != '-') || (_value[start + 13] != '-') || (_value[start + 18] != '-') || (_value[start + 23] != '-'))
{
return ret;
}
#endif
#define MYGUI_CONVERT_HEX(value) ((convert_hex[ ((value) - 48) & 0x3F]) & 0x3F)
#if MYGUI_DEBUG_MODE == 1
#define MYGUI_CHECK_CONVERT_HEX(value) \
{ \
char tmp = ((value) - 48); \
if ((tmp > 63) || (tmp < 0)) \
{ \
/*MYGUI_LOG(Error, "error parse guid'" << _value << "'");*/ \
return Guid(); \
} \
tmp = convert_hex[(int)tmp]; \
if (tmp > 63) \
{ \
/*MYGUI_LOG(Error, "error parse guid'" << _value << "'");*/ \
return Guid(); \
} \
}
#else
#define MYGUI_CHECK_CONVERT_HEX(value)
#endif
size_t count = 8;
size_t pos = start;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data1 <<= 4;
ret.original.data1 += MYGUI_CONVERT_HEX(_value[pos]);
count --;
pos ++;
}
count = 4;
pos ++;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data2 <<= 4;
ret.original.data2 += MYGUI_CONVERT_HEX(_value[pos]);
count --;
pos ++;
}
count = 4;
pos ++;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data3 <<= 4;
ret.original.data3 += MYGUI_CONVERT_HEX(_value[pos]);
count --;
pos ++;
}
count = 2; // здесь по два байта парсится
pos ++;
size_t num = 0;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
count --;
}
count = 6; // здесь по два байта парсится
pos ++;
while (count > 0)
{
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num] = MYGUI_CONVERT_HEX(_value[pos++]) << 4;
MYGUI_CHECK_CONVERT_HEX(_value[pos]);
ret.original.data4[num++] += MYGUI_CONVERT_HEX(_value[pos++]);
count --;
}
#undef MYGUI_CHECK_CONVERT_HEX
#undef MYGUI_CONVERT_HEX
return ret;
}
std::string Guid::print() const
{
const size_t SIZE = 39;
char buff[SIZE];
sprintf(buff, "{%.8X-%.4X-%.4X-%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X}", (int)(original.data1), (int)(original.data2), (int)(original.data3),
(int)(original.data4[0]), (int)(original.data4[1]),
(int)(original.data4[2]), (int)(original.data4[3]), (int)(original.data4[4]), (int)(original.data4[5]), (int)(original.data4[6]), (int)(original.data4[7])
);
return buff;
}
Guid Guid::generate()
{
Guid ret;
#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32
HRESULT result = CoCreateGuid((GUID*)&ret.original.data1);
MYGUI_ASSERT(S_OK == result, "Error generate GUID");
#elif MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX
uuid_generate(ret.vec._data1);
#else
//FIXME
uuid_generate(ret.vec._data1);// or what else?
#endif
return ret;
}
} // namespace MyGUI