mirror of
https://github.com/boostorg/thread.git
synced 2026-01-28 07:42:12 +00:00
123 lines
1.8 KiB
C++
123 lines
1.8 KiB
C++
#include <boost/thread/detail/named.hpp>
|
|
#include <string.h>
|
|
#include <malloc.h>
|
|
|
|
namespace {
|
|
|
|
char* concat(char* result, const char* buf)
|
|
{
|
|
if (result == 0)
|
|
return strdup(buf);
|
|
|
|
int len = strlen(result) + strlen(buf) + 1;
|
|
result = (char*)realloc(result, len);
|
|
strcat(result, buf);
|
|
return result;
|
|
}
|
|
|
|
char* get_root()
|
|
{
|
|
#if defined(BOOST_HAS_WINTHREADS)
|
|
return "";
|
|
#elif defined(BOOST_HAS_PTHREADS)
|
|
return "/";
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
char* encode(const char* str)
|
|
{
|
|
const char* digits="0123456789abcdef";
|
|
char* result=0;
|
|
static char buf[100];
|
|
char* ebuf = buf + 100;
|
|
char* p = buf;
|
|
*p = 0;
|
|
strcat(p, get_root());
|
|
p = p + strlen(p);
|
|
while (*str)
|
|
{
|
|
if (((*str >= '0') && (*str <= '9')) ||
|
|
((*str >= 'a') && (*str <= 'z')) ||
|
|
((*str >= 'A') && (*str <= 'Z')) ||
|
|
(*str == '/') || (*str == '.') || (*str == '_'))
|
|
{
|
|
*p = *str;
|
|
}
|
|
else if (*str == ' ')
|
|
{
|
|
*p = '+';
|
|
}
|
|
else
|
|
{
|
|
if (p + 3 >= ebuf)
|
|
{
|
|
*p = 0;
|
|
result = concat(result, buf);
|
|
p = buf;
|
|
}
|
|
*p = '%';
|
|
char* e = p + 2;
|
|
int v = *str;
|
|
while (e > p)
|
|
{
|
|
*e-- = digits[v % 16];
|
|
v /= 16;
|
|
}
|
|
p += 2;
|
|
}
|
|
if (++p == ebuf)
|
|
{
|
|
*p = 0;
|
|
result = concat(result, buf);
|
|
p = buf;
|
|
}
|
|
++str;
|
|
}
|
|
*p = 0;
|
|
result = concat(result, buf);
|
|
return result;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
namespace boost {
|
|
namespace detail {
|
|
|
|
named_object::named_object(const char* name)
|
|
: m_name(0), m_ename(0)
|
|
{
|
|
if (name)
|
|
{
|
|
m_name = strdup(name);
|
|
if (*m_name == '%')
|
|
m_ename = m_name + 1;
|
|
else
|
|
m_ename = encode(name);
|
|
}
|
|
}
|
|
|
|
named_object::~named_object()
|
|
{
|
|
if (m_name)
|
|
{
|
|
if (*m_name != '%')
|
|
free(m_ename);
|
|
free(m_name);
|
|
}
|
|
}
|
|
|
|
const char* named_object::name() const
|
|
{
|
|
return m_name;
|
|
}
|
|
|
|
const char* named_object::effective_name() const
|
|
{
|
|
return m_ename;
|
|
}
|
|
|
|
} // namespace detail
|
|
} // namespace boost
|