diff options
Diffstat (limited to 'Src/Plugins/General/gen_ml/gaystring.cpp')
-rw-r--r-- | Src/Plugins/General/gen_ml/gaystring.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ml/gaystring.cpp b/Src/Plugins/General/gen_ml/gaystring.cpp new file mode 100644 index 00000000..76c8d9ba --- /dev/null +++ b/Src/Plugins/General/gen_ml/gaystring.cpp @@ -0,0 +1,182 @@ +#include "gaystring.h" + +GayString::GayString(const char *initial) +{ + len = 0; + m_buf = NULL; + m_alloc = 0; + if (initial && *initial) Set(initial); +} + +GayString::~GayString() +{ + if ( m_buf ) + free( m_buf ); +} + +void GayString::Set(const char *value) +{ + if (!value) value=""; + len = strlen(value); + Grow(len + 1); + strncpy(m_buf, value, len); + m_buf[len] = 0; +} + +char *GayString::Get() { return m_buf ? m_buf : (char*)""; } + +void GayString::Append(const char *append) +{ + size_t oldsize = len; + len += strlen(append); + Grow(len + 1); + strncpy(m_buf + oldsize, append, len - oldsize); + m_buf[len] = 0; +} + +void GayString::Grow(size_t newsize) +{ + if (m_alloc < newsize) + { + size_t old_m_alloc = m_alloc; + m_alloc = newsize + 32; + char *new_m_buf = (char*)realloc(m_buf, m_alloc*sizeof(char)); + if (!new_m_buf) + { + new_m_buf = (char*)malloc(m_alloc*sizeof(char)); + if (!new_m_buf) + { + m_alloc = old_m_alloc; + } + else + { + memcpy(new_m_buf, m_buf, old_m_alloc*sizeof(char)); + free(m_buf); + m_buf = new_m_buf; + } + } + else m_buf = new_m_buf; + } +} + +void GayString::Compact() +{ + if (m_buf) + { + size_t old_m_alloc = m_alloc; + //m_alloc = strlen(m_buf) + 1; + m_alloc = len + 1; + char* new_m_buf = (char*)realloc(m_buf, m_alloc*sizeof(char)); + if (!new_m_buf) + { + new_m_buf = (char*)malloc(m_alloc*sizeof(char)); + if (!new_m_buf) + { + if (m_alloc > old_m_alloc) + m_alloc = old_m_alloc; + } + else + { + if (m_alloc > old_m_alloc) + m_alloc = old_m_alloc; + + memcpy(new_m_buf, m_buf, old_m_alloc*sizeof(char)); + free(m_buf); + m_buf = new_m_buf; + } + } + else m_buf = new_m_buf; + } +} + +size_t GayString::Length() { return len; } + +/* */ +GayStringW::GayStringW(const wchar_t *initial) +{ + len = 0; + m_buf = NULL; + m_alloc = 0; + if (initial && *initial) Set(initial); +} + +GayStringW::~GayStringW() +{ + free(m_buf); +} + +void GayStringW::Set(const wchar_t *value) +{ + if (!value) value=L""; + len = wcslen(value); + Grow(len + 1); + wcsncpy(m_buf, value, len); + m_buf[len] = 0; +} + +const wchar_t *GayStringW::Get() { return m_buf ? m_buf : L""; } + +void GayStringW::Append(const wchar_t *append) +{ + size_t oldsize = len; + len += wcslen(append); + Grow(len + 1); + wcsncpy(m_buf + oldsize, append, len - oldsize); + m_buf[len] = 0; +} + +void GayStringW::Grow(size_t newsize) +{ + if (m_alloc < newsize) + { + size_t old_m_alloc = m_alloc; + m_alloc = newsize + 32; + wchar_t *new_m_buf = (wchar_t*)realloc(m_buf, m_alloc*sizeof(wchar_t)); + if (!new_m_buf) + { + new_m_buf = (wchar_t*)malloc(m_alloc*sizeof(wchar_t)); + if (!new_m_buf) + { + m_alloc = old_m_alloc; + } + else + { + memcpy(new_m_buf, m_buf, old_m_alloc*sizeof(wchar_t)); + free(m_buf); + m_buf = new_m_buf; + } + } + else m_buf = new_m_buf; + } +} + +void GayStringW::Compact() +{ + if (m_buf) + { + size_t old_m_alloc = m_alloc; + m_alloc = len + 1; + wchar_t* new_m_buf = (wchar_t*)realloc(m_buf, m_alloc*sizeof(wchar_t)); + if (!new_m_buf) + { + new_m_buf = (wchar_t*)malloc(m_alloc*sizeof(wchar_t)); + if (!new_m_buf) + { + if (m_alloc > old_m_alloc) + m_alloc = old_m_alloc; + } + else + { + if (m_alloc > old_m_alloc) + m_alloc = old_m_alloc; + + memcpy(new_m_buf, m_buf, old_m_alloc*sizeof(wchar_t)); + free(m_buf); + m_buf = new_m_buf; + } + } + else m_buf = new_m_buf; + } +} + +size_t GayStringW::Length() { return len; }
\ No newline at end of file |