diff options
Diffstat (limited to 'plugins')
29 files changed, 2390 insertions, 2985 deletions
| diff --git a/plugins/SmileyAdd/SmileyAdd_10.vcxproj b/plugins/SmileyAdd/SmileyAdd_10.vcxproj index e9c91aed19..70bae6c7da 100644 --- a/plugins/SmileyAdd/SmileyAdd_10.vcxproj +++ b/plugins/SmileyAdd/SmileyAdd_10.vcxproj @@ -200,7 +200,6 @@    <ItemGroup>
      <ClCompile Include="src\anim.cpp" />
      <ClCompile Include="src\AniSmileyObject.cpp" />
 -    <ClCompile Include="src\bkstring.cpp" />
      <ClCompile Include="src\customsmiley.cpp" />
      <ClCompile Include="src\dlgboxsubclass.cpp" />
      <ClCompile Include="src\download.cpp" />
 @@ -226,7 +225,6 @@    </ItemGroup>
    <ItemGroup>
      <ClInclude Include="src\anim.h" />
 -    <ClInclude Include="src\bkstring.h" />
      <ClInclude Include="src\customsmiley.h" />
      <ClInclude Include="src\download.h" />
      <ClInclude Include="src\general.h" />
 diff --git a/plugins/SmileyAdd/SmileyAdd_10.vcxproj.filters b/plugins/SmileyAdd/SmileyAdd_10.vcxproj.filters index 4d8633ebe9..91917aaa92 100644 --- a/plugins/SmileyAdd/SmileyAdd_10.vcxproj.filters +++ b/plugins/SmileyAdd/SmileyAdd_10.vcxproj.filters @@ -21,9 +21,6 @@      <ClCompile Include="src\AniSmileyObject.cpp">
        <Filter>Source Files</Filter>
      </ClCompile>
 -    <ClCompile Include="src\bkstring.cpp">
 -      <Filter>Source Files</Filter>
 -    </ClCompile>
      <ClCompile Include="src\customsmiley.cpp">
        <Filter>Source Files</Filter>
      </ClCompile>
 @@ -77,9 +74,6 @@      <ClInclude Include="src\anim.h">
        <Filter>Header Files</Filter>
      </ClInclude>
 -    <ClInclude Include="src\bkstring.h">
 -      <Filter>Header Files</Filter>
 -    </ClInclude>
      <ClInclude Include="src\customsmiley.h">
        <Filter>Header Files</Filter>
      </ClInclude>
 diff --git a/plugins/SmileyAdd/SmileyAdd_11.vcxproj b/plugins/SmileyAdd/SmileyAdd_11.vcxproj index b60d3de8f6..ff4416bf0b 100644 --- a/plugins/SmileyAdd/SmileyAdd_11.vcxproj +++ b/plugins/SmileyAdd/SmileyAdd_11.vcxproj @@ -203,7 +203,6 @@    <ItemGroup>
      <ClCompile Include="src\anim.cpp" />
      <ClCompile Include="src\AniSmileyObject.cpp" />
 -    <ClCompile Include="src\bkstring.cpp" />
      <ClCompile Include="src\customsmiley.cpp" />
      <ClCompile Include="src\dlgboxsubclass.cpp" />
      <ClCompile Include="src\download.cpp" />
 @@ -229,7 +228,6 @@    </ItemGroup>
    <ItemGroup>
      <ClInclude Include="src\anim.h" />
 -    <ClInclude Include="src\bkstring.h" />
      <ClInclude Include="src\customsmiley.h" />
      <ClInclude Include="src\download.h" />
      <ClInclude Include="src\general.h" />
 diff --git a/plugins/SmileyAdd/SmileyAdd_11.vcxproj.filters b/plugins/SmileyAdd/SmileyAdd_11.vcxproj.filters index 4d8633ebe9..91917aaa92 100644 --- a/plugins/SmileyAdd/SmileyAdd_11.vcxproj.filters +++ b/plugins/SmileyAdd/SmileyAdd_11.vcxproj.filters @@ -21,9 +21,6 @@      <ClCompile Include="src\AniSmileyObject.cpp">
        <Filter>Source Files</Filter>
      </ClCompile>
 -    <ClCompile Include="src\bkstring.cpp">
 -      <Filter>Source Files</Filter>
 -    </ClCompile>
      <ClCompile Include="src\customsmiley.cpp">
        <Filter>Source Files</Filter>
      </ClCompile>
 @@ -77,9 +74,6 @@      <ClInclude Include="src\anim.h">
        <Filter>Header Files</Filter>
      </ClInclude>
 -    <ClInclude Include="src\bkstring.h">
 -      <Filter>Header Files</Filter>
 -    </ClInclude>
      <ClInclude Include="src\customsmiley.h">
        <Filter>Header Files</Filter>
      </ClInclude>
 diff --git a/plugins/SmileyAdd/SmileyAdd_12.vcxproj b/plugins/SmileyAdd/SmileyAdd_12.vcxproj index a633ba2a21..a21b90920c 100644 --- a/plugins/SmileyAdd/SmileyAdd_12.vcxproj +++ b/plugins/SmileyAdd/SmileyAdd_12.vcxproj @@ -203,7 +203,6 @@    <ItemGroup>
      <ClCompile Include="src\anim.cpp" />
      <ClCompile Include="src\AniSmileyObject.cpp" />
 -    <ClCompile Include="src\bkstring.cpp" />
      <ClCompile Include="src\customsmiley.cpp" />
      <ClCompile Include="src\dlgboxsubclass.cpp" />
      <ClCompile Include="src\download.cpp" />
 @@ -229,7 +228,6 @@    </ItemGroup>
    <ItemGroup>
      <ClInclude Include="src\anim.h" />
 -    <ClInclude Include="src\bkstring.h" />
      <ClInclude Include="src\customsmiley.h" />
      <ClInclude Include="src\download.h" />
      <ClInclude Include="src\general.h" />
 diff --git a/plugins/SmileyAdd/SmileyAdd_12.vcxproj.filters b/plugins/SmileyAdd/SmileyAdd_12.vcxproj.filters index 4d8633ebe9..91917aaa92 100644 --- a/plugins/SmileyAdd/SmileyAdd_12.vcxproj.filters +++ b/plugins/SmileyAdd/SmileyAdd_12.vcxproj.filters @@ -21,9 +21,6 @@      <ClCompile Include="src\AniSmileyObject.cpp">
        <Filter>Source Files</Filter>
      </ClCompile>
 -    <ClCompile Include="src\bkstring.cpp">
 -      <Filter>Source Files</Filter>
 -    </ClCompile>
      <ClCompile Include="src\customsmiley.cpp">
        <Filter>Source Files</Filter>
      </ClCompile>
 @@ -77,9 +74,6 @@      <ClInclude Include="src\anim.h">
        <Filter>Header Files</Filter>
      </ClInclude>
 -    <ClInclude Include="src\bkstring.h">
 -      <Filter>Header Files</Filter>
 -    </ClInclude>
      <ClInclude Include="src\customsmiley.h">
        <Filter>Header Files</Filter>
      </ClInclude>
 diff --git a/plugins/SmileyAdd/src/SmileyBase.cpp b/plugins/SmileyAdd/src/SmileyBase.cpp index 206ee79a73..94f89961de 100644 --- a/plugins/SmileyAdd/src/SmileyBase.cpp +++ b/plugins/SmileyAdd/src/SmileyBase.cpp @@ -156,7 +156,7 @@ ULONG ISmileyBase::AddRef(void)  ULONG ISmileyBase::Release(void)
  {
  	LONG count = InterlockedDecrement(&m_lRefCount);
 -	if(count == 0) 
 +	if (count == 0) 
  		delete this;
  	return count;
  }
 diff --git a/plugins/SmileyAdd/src/anim.cpp b/plugins/SmileyAdd/src/anim.cpp index 0fbf663346..d84afa5bab 100644 --- a/plugins/SmileyAdd/src/anim.cpp +++ b/plugins/SmileyAdd/src/anim.cpp @@ -38,8 +38,7 @@ void Animate::StartAnimation(void)  {
  	m_img = m_sml->CreateCachedImage();
 -	if (m_img && m_img->IsAnimated())
 -	{
 +	if (m_img && m_img->IsAnimated()) {
  		m_img->SelectFrame(m_nFramePosition);
  		long frtm = m_img->GetFrameDelay();
  		m_counter = frtm / 10 + ((frtm % 10) >= 5);
 @@ -49,8 +48,7 @@ void Animate::StartAnimation(void)  void Animate::ProcessTimerTick(HWND hwnd)
  {
 -	if (m_running && m_img->IsAnimated() && --m_counter <= 0)
 -	{
 +	if (m_running && m_img->IsAnimated() && --m_counter <= 0) {
  		m_nFramePosition = m_img->SelectNextFrame(m_nFramePosition);
  		long frtm = m_img->GetFrameDelay();
 @@ -82,8 +80,7 @@ void Animate::DrawFrame(HDC hdc)  void Animate::Draw(HDC hdc) 
  { 
 -	if (m_running)
 -	{
 +	if (m_running) {
  		m_img->Draw(hdc, m_cliprect, m_clip);
  		if (m_sel)
 @@ -102,16 +99,14 @@ void Animate::SetOffset(int off, int wsize)  	m_offset = off; 
  	m_running = m_cliprect.top >= 0 && m_cliprect.top < wsize;
 -	if (m_running)
 -	{
 -		if (m_img == NULL) 
 -		{
 +	if (m_running) {
 +		if (m_img == NULL) {
  			StartAnimation();
 -			if (m_img == NULL) m_running = false;
 +			if (m_img == NULL)
 +				m_running = false;
  		}
  	}
 -	else
 -	{
 +	else {
  		if (m_img) m_img->Release();
  		m_img = NULL;
  	}
 @@ -120,8 +115,7 @@ void Animate::SetOffset(int off, int wsize)  void Animate::SetSel(int x, int y)
  {
 -	m_sel = x >= m_cliprect.left && x < m_cliprect.right && 
 -		y >= m_cliprect.top && y < m_cliprect.bottom;
 +	m_sel = x >= m_cliprect.left && x < m_cliprect.right && y >= m_cliprect.top && y < m_cliprect.bottom;
  }
 diff --git a/plugins/SmileyAdd/src/bkstring.cpp b/plugins/SmileyAdd/src/bkstring.cpp deleted file mode 100644 index dc8d653e84..0000000000 --- a/plugins/SmileyAdd/src/bkstring.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/*
 -Miranda SmileyAdd Plugin
 -Copyright (C) 2008 - 2011 Boris Krasnovskiy All Rights Reserved
 -
 -This program is free software; you can redistribute it and/or
 -modify it under the terms of the GNU General Public License
 -as published by the Free Software Foundation version 2
 -of the License.
 -
 -This program 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 General Public License for more details.
 -
 -You should have received a copy of the GNU General Public License
 -along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -*/
 -
 -#include "general.h"
 -
 -bkstring::~bkstring() { if (sizeAlloced) free(buf); }
 -
 -void bkstring::reserve(size_type len)
 -{
 -	if (len >= sizeAlloced || sizeAlloced == 0)
 -	{
 -		if (sizeAlloced == 0) buf = NULL;
 -		buf = (value_type*)realloc(buf, (len+1) * sizeof(value_type));
 -		if (sizeAlloced == 0) buf[0] = 0;
 -		sizeAlloced = len+1;
 -	}
 -}
 -
 -void bkstring::appendfmt(const value_type *fmt, ...) 
 -{
 -	areserve(_tcslen(fmt)*2);
 -
 -	va_list vararg;
 -	va_start(vararg, fmt);
 -	for (;;) 
 -	{
 -		int len = mir_vsntprintf(buf + lenBuf, sizeAlloced - lenBuf - 1, fmt, vararg);
 -		if (len < 0)
 -			reserve(sizeAlloced + 256);
 -		else
 -		{
 -			lenBuf += len;
 -			buf[lenBuf] = 0;
 -			break;
 -		}
 -	}
 -	va_end(vararg);
 -}
 -
 -bkstring& bkstring::append(const value_type* _Ptr)
 -{
 -	size_type len = _tcslen(_Ptr);
 -	areserve(len);
 -	memcpy(buf+lenBuf, _Ptr, (len+1)*sizeof(value_type));
 -	lenBuf += len;
 -	return *this;
 -}
 -
 -bkstring& bkstring::append(const value_type* _Ptr, size_type _Count)
 -{
 -	size_type len = min(_tcslen(_Ptr), _Count);
 -	areserve(len);
 -	memcpy(buf+lenBuf, _Ptr, len*sizeof(value_type));
 -	lenBuf += len;
 -	buf[lenBuf] = 0;
 -	return *this;
 -}
 -
 -bkstring& bkstring::append(const bkstring& _Str, size_type _Off, size_type _Count)
 -{
 -	size_type len = min(_Count, _Str.size() - _Off);
 -	areserve(len);
 -	memcpy(buf+lenBuf, _Str.c_str()+_Off, len*sizeof(value_type));
 -	lenBuf += len;
 -	buf[lenBuf] = 0;
 -	return *this;
 -}
 -
 -bkstring& bkstring::append(const bkstring& _Str)
 -{
 -	size_type len = _Str.size();
 -	areserve(len);
 -	memcpy(buf+lenBuf, _Str.c_str(), len*sizeof(value_type));
 -	lenBuf += len;
 -	buf[lenBuf] = 0;
 -	return *this;
 -}
 -
 -bkstring& bkstring::append(size_type _Count, value_type _Ch)
 -{
 -	areserve(_Count);
 -	for(size_type i=0; i<_Count; ++i) buf[lenBuf+i] = _Ch;
 -	lenBuf += _Count;
 -	buf[lenBuf] = 0;
 -	return *this;
 -}
 -
 -
 -bkstring& bkstring::assign(const value_type* _Ptr, size_type _Count)
 -{
 -	if (_Count == 0 && sizeAlloced == 0)
 -	{
 -		buf = (TCHAR*)_T("");
 -	}
 -	else
 -	{
 -		reserve(_Count);
 -		memcpy(buf, _Ptr, _Count*sizeof(value_type));
 -		buf[_Count] = 0;
 -		lenBuf = _Count;
 -	}
 -	return *this;
 -}
 -
 -bkstring& bkstring::assign(const bkstring& _Str, size_type _Off, size_type _Count)
 -{
 -	size_type len = min(_Count, _Str.size() - _Off);
 -	if (len == 0 && sizeAlloced == 0)
 -	{
 -		buf = (TCHAR*)_T("");
 -	}
 -	else
 -	{
 -		reserve(len);
 -		memcpy(buf, _Str.c_str() + _Off, len*sizeof(value_type));
 -		lenBuf = len;
 -		buf[len] = 0;
 -	}
 -	return *this;
 -}
 -
 -bkstring& bkstring::assign(size_type _Count, value_type _Ch)
 -{
 -	reserve(_Count);
 -	for(size_type i=0; i<_Count; ++i) buf[i] = _Ch;
 -	buf[_Count] = 0;
 -	lenBuf = _Count;
 -	return *this;
 -}
 -
 -bkstring::size_type bkstring::find(value_type _Ch, size_type _Off) const
 -{
 -	for (size_type i=_Off; i<=lenBuf; ++i)
 -		if (buf[i] == _Ch) return i;
 -	return (size_type)npos;
 -}
 -
 -bkstring::size_type bkstring::find(const value_type* _Ptr, size_type _Off) const
 -{
 -	if (_Off > lenBuf) return (size_type)npos;
 -
 -	value_type* pstr = _tcsstr(buf+_Off, _Ptr);
 -	return pstr ? pstr - buf : npos;
 -}
 -
 -bkstring::size_type bkstring::find_last_of(value_type _Ch, size_type _Off) const
 -{
 -	for (size_type i=(_Off == npos ? lenBuf : _Off); i--;)
 -		if (buf[i] == _Ch) return i;
 -	return (size_type)npos;
 -}
 -
 -bkstring& bkstring::insert(size_type _P0, const value_type* _Ptr, size_type _Count)
 -{
 -	size_type len = _tcslen(_Ptr);
 -	if (_Count < len) len = _Count;
 -	areserve(len);
 -	value_type *p = buf + _P0;
 -	memmove(p+len, p, (lenBuf-_P0+1)*sizeof(value_type));
 -	memcpy(p, _Ptr, _Count*sizeof(value_type));
 -	lenBuf += len;
 -	return *this;
 -}
 -
 -bkstring& bkstring::insert(size_type _P0, size_type _Count, value_type _Ch)
 -{
 -	areserve(_Count);
 -	value_type *p = buf + _P0;
 -	memmove(p+_Count, p, (lenBuf-_P0+1)*sizeof(value_type));
 -	for(size_type i=0; i<_Count; ++i) p[i] = _Ch;
 -	lenBuf += _Count;
 -	return *this;
 -}
 -
 -bkstring& bkstring::erase(size_type _Pos, size_type _Count)
 -{
 -	if (_Pos < lenBuf)
 -	{
 -		const size_type len = min(lenBuf - _Pos, _Count);
 -		value_type *p = buf + _Pos;
 -		lenBuf -= len;
 -		memmove(p, p+len, (lenBuf - _Pos)*sizeof(value_type));
 -		buf[lenBuf] = 0;
 -	}
 -	return *this;
 -}
 diff --git a/plugins/SmileyAdd/src/bkstring.h b/plugins/SmileyAdd/src/bkstring.h deleted file mode 100644 index f5752cb280..0000000000 --- a/plugins/SmileyAdd/src/bkstring.h +++ /dev/null @@ -1,258 +0,0 @@ -/*
 -Miranda SmileyAdd Plugin
 -Copyright (C) 2008 - 2011 Boris Krasnovskiy All Rights Reserved
 -
 -This program is free software; you can redistribute it and/or
 -modify it under the terms of the GNU General Public License
 -as published by the Free Software Foundation version 2
 -of the License.
 -
 -This program 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 General Public License for more details.
 -
 -You should have received a copy of the GNU General Public License
 -along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -*/
 -
 -
 -class bkstring
 -{
 -public:
 -	typedef size_t size_type;
 -	typedef TCHAR  value_type;
 -	typedef value_type* iterator;
 -	typedef const value_type* const_iterator;
 -
 -	static const size_type npos = size_type(-1);
 -
 -private:
 -	value_type* buf;
 -	size_type sizeAlloced;
 -	size_type lenBuf;
 -
 -	void areserve(size_type len) { reserve(lenBuf + len); }
 -
 -public:
 -
 -	explicit bkstring() : buf((TCHAR*)_T("")), sizeAlloced(0), lenBuf(0) 
 -	{}
 -
 -	bkstring(const value_type* _Ptr, size_type _Count) : sizeAlloced(0), lenBuf(0)
 -	{ assign(_Ptr, _Count); }
 -
 -	bkstring(const value_type* _Ptr) : sizeAlloced(0), lenBuf(0)
 -	{ assign(_Ptr); }
 -
 -	bkstring(size_type _Count, value_type _Ch) : sizeAlloced(0), lenBuf(0)
 -	{ assign(_Count, _Ch); }
 -
 -	bkstring(const bkstring& _Str) : sizeAlloced(0), lenBuf(0)
 -	{ assign(_Str); }
 -
 -	bkstring(const bkstring& _Str, size_type _Off, size_type _Count) : sizeAlloced(0), lenBuf(0)
 -	{ assign(_Str, _Off, _Count); }
 -
 -	~bkstring();
 -
 -	size_type size(void) const { return lenBuf; }
 -	const value_type* c_str(void) const { return buf; }
 -
 -	void clear(void) { if (lenBuf) { lenBuf = 0; buf[0] = 0; } }
 -	void insert(const value_type *txt);
 -	void reserve(size_type len);
 -
 -	bkstring& assign(const value_type* _Ptr)
 -	{ return assign(_Ptr, _tcslen(_Ptr)); }
 -
 -	bkstring& assign(const bkstring& _Str)
 -	{ return assign(_Str, 0, (size_type)npos); }
 -
 -	bkstring& assign(const value_type* _Ptr, size_type _Count);
 -	bkstring& assign(const bkstring& _Str, size_type off, size_type _Count);
 -	bkstring& assign(size_type _Count, value_type _Ch);
 -
 -	bkstring& append(const value_type* _Ptr);
 -	bkstring& append(const value_type* _Ptr, size_type _Count);
 -	bkstring& append(const bkstring& _Str, size_type _Off, size_type _Count);
 -	bkstring& append(const bkstring& _Str);
 -	bkstring& append(size_type _Count, value_type _Ch);
 -
 -	int compare(const bkstring& _Str) const 
 -	{ return _tcscmp(buf, _Str.c_str()); }
 -	
 -	int compare(size_type _Pos1, size_type _Num1, const bkstring& _Str) const 
 -	{ return _tcsncmp(&buf[_Pos1], _Str.c_str(), _Num1); }
 -	
 -	int compare(size_type _Pos1, size_type _Num1, const bkstring& _Str, size_type _Off, size_type _Count) const
 -	{ return _tcsncmp(&buf[_Pos1], _Str.c_str()+_Off, min(_Num1, _Count)); }
 -
 -	int compare(const value_type* _Ptr) const 
 -	{ return _tcscmp(buf, _Ptr); }
 -	
 -	int compare(size_type _Pos1, size_type _Num1, const value_type* _Ptr) const
 -	{ return _tcsncmp(&buf[_Pos1], _Ptr, _Num1); }
 -	
 -	int compare(size_type _Pos1, size_type _Num1, const value_type* _Ptr, size_type _Num2) const
 -	{ return _tcsncmp(&buf[_Pos1], _Ptr, min(_Num1, _Num2)); }
 -
 -	int comparei(const bkstring& _Str) const 
 -	{ return _tcsicmp(buf, _Str.c_str()); }
 -	
 -	int comparei(size_type _Pos1, size_type _Num1, const bkstring& _Str) const 
 -	{ return _tcsnicmp(&buf[_Pos1], _Str.c_str(), _Num1); }
 -	
 -	int comparei(size_type _Pos1, size_type _Num1, const bkstring& _Str, size_type _Off, size_type _Count) const
 -	{ return _tcsnicmp(&buf[_Pos1], _Str.c_str()+_Off, min(_Num1, _Count)); }
 -
 -	int comparei(const value_type* _Ptr) const 
 -	{ return _tcsicmp(buf, _Ptr); }
 -	
 -	int comparei(size_type _Pos1, size_type _Num1, const value_type* _Ptr) const
 -	{ return _tcsnicmp(&buf[_Pos1], _Ptr, _Num1); }
 -	
 -	int comparei(size_type _Pos1, size_type _Num1, const value_type* _Ptr, size_type _Num2) const
 -	{ return _tcsnicmp(&buf[_Pos1], _Ptr, min(_Num1, _Num2)); }
 -
 -	bool empty(void) const { return lenBuf == 0; };
 -	bkstring& erase(size_type _Pos = 0, size_type _Count = npos);
 -
 -	size_type find(value_type _Ch, size_type _Off = 0) const;
 -	size_type find(const value_type* _Ptr, size_type _Off = 0) const;
 -	size_type find(bkstring& _Str, size_type _Off = 0) const
 -	{ return find(_Str.c_str(), _Off); }
 -
 -	size_type find_last_of(value_type _Ch, size_type _Off = npos) const;
 -
 -	bkstring& insert(size_type _P0, const value_type* _Ptr)
 -	{ return insert(_P0, _Ptr, _tcslen(_Ptr)); }
 -	
 -	bkstring& insert(size_type _P0, const bkstring& _Str)
 -	{ return insert(_P0, _Str.c_str(), _Str.size()); };
 -
 -	bkstring& insert(size_type _P0, const value_type* _Ptr, size_type _Count);
 -	bkstring& insert(size_type _P0, size_type _Count, value_type _Ch);
 -
 -	bkstring substr(size_type _Off = 0, size_type _Count = npos) const
 -	{ return bkstring(*this, _Off, _Count); }
 -
 -	bkstring& operator = (const bkstring& _Str)
 -	{ return assign(_Str); }
 -
 -	bkstring& operator =(const value_type* _Ptr)
 -	{ return assign(_Ptr); }
 -
 -	bkstring& operator = (const value_type _Ch)
 -	{ return assign(1, _Ch); }
 -
 -	bkstring& operator +=(const bkstring& _Str)
 -	{ return append(_Str); }
 -
 -	bkstring& operator += (const value_type* _Ptr)
 -	{ return append(_Ptr); }
 -
 -	bkstring& operator += (const value_type _Ch)
 -	{ return append(1, _Ch); }
 -
 -	value_type& operator[] (size_t ind) const
 -	{ return buf[ind]; }
 -
 -	friend bkstring operator+ (const bkstring& _Str1, const bkstring& _Str2)
 -	{ bkstring s(_Str1); return s.append(_Str2); }
 -
 -	friend bkstring operator+ (const bkstring& _Str1, const value_type* _Ptr2)
 -	{ bkstring s(_Str1); return s.append(_Ptr2); }
 -
 -	friend bkstring operator+(const value_type* _Ptr1, const bkstring& _Str2)
 -	{ bkstring s(_Ptr1); return s.append(_Str2); }
 -
 -	friend bkstring operator+ (const bkstring& _Str1, const value_type _Ch)
 -	{ bkstring s(_Str1); return s.append(1, _Ch); }
 -
 -	friend bool operator==(const bkstring& _Str1, const bkstring& _Str2)
 -	{ return _Str1.compare(_Str2) == 0; }
 -
 -	friend bool operator==(const bkstring& _Str1, const value_type* _Ptr2)
 -	{ return _Str1.compare(_Ptr2) == 0; }
 -
 -	friend bool operator==(const value_type* _Ptr1, const bkstring& _Str2)
 -	{ return _Str2.compare(_Ptr1) == 0; }
 -
 -	friend bool operator!=(const bkstring& _Str1, const bkstring& _Str2)
 -	{ return _Str1.compare(_Str2) != 0; }
 -
 -	friend bool operator!=(const bkstring& _Str1, const value_type* _Ptr2)
 -	{ return _Str1.compare(_Ptr2) != 0; }
 -
 -	friend bool operator!=(const value_type* _Ptr1, const bkstring& _Str2)
 -	{ return _Str2.compare(_Ptr1) != 0; }
 -
 -	friend bool operator<(const bkstring& _Str1, const bkstring& _Str2)
 -	{ return _Str1.compare(_Str2) < 0; }
 -
 -	friend bool operator<(const bkstring& _Str1, const value_type* _Ptr2)
 -	{ return _Str1.compare(_Ptr2) < 0; }
 -
 -	friend bool operator<(const value_type* _Ptr1, const bkstring& _Str2)
 -	{ return _Str2.compare(_Ptr1) > 0; }
 -
 -	friend bool operator>(const bkstring& _Str1, const bkstring& _Str2)
 -	{ return _Str1.compare(_Str2) > 0; }
 -
 -	friend bool operator>(const bkstring& _Str1, const value_type* _Ptr2)
 -	{ return _Str1.compare(_Ptr2) > 0; }
 -
 -	friend bool operator>(const value_type* _Ptr1, const bkstring& _Str2)
 -	{ return _Str2.compare(_Ptr1) < 0; }
 -
 -	friend bool operator<=(const bkstring& _Str1, const bkstring& _Str2)
 -	{ return _Str1.compare(_Str2) <= 0; }
 -
 -	friend bool operator<=(const bkstring& _Str1, const value_type* _Ptr2)
 -	{  return _Str1.compare(_Ptr2) <= 0; }
 -
 -	friend bool  operator<=(const value_type* _Ptr1, const bkstring& _Str2)
 -	{ return _Str2.compare(_Ptr1) >= 0; }
 -
 -	friend bool  operator>=(const bkstring& _Str1, const bkstring& _Str2)
 -	{ return _Str1.compare(_Str2) >= 0; }
 -
 -	friend bool  operator>=(const bkstring& _Str1, const value_type* _Ptr2)
 -	{ return _Str1.compare(_Ptr2) >= 0; }
 -
 -	friend bool  operator>=(const value_type* _Ptr1, const bkstring& _Str2)
 -	{ return _Str2.compare(_Ptr1) <= 0; }
 -
 -	friend bool  operator==(const value_type _Ch1, const bkstring& _Str2)
 -	{  return (_Str2.size() == 1) && (_Str2[0] == _Ch1); }
 -
 -	friend bool  operator==(const bkstring& _Str1, const value_type _Ch2)
 -	{ return (_Str1.size() == 1) && (_Str1[0] == _Ch2); }
 -
 -	friend bool  operator!=(const value_type _Ch1, const bkstring& _Str2)
 -	{  return (_Str2.size() != 1) || (_Str2[0] != _Ch1); }
 -
 -	friend bool  operator!=(const bkstring& _Str1, const value_type _Ch2)
 -	{ return (_Str1.size() != 1) || (_Str1[0] != _Ch2); }
 -
 -	iterator begin(void)
 -	{ return buf; }
 -	
 -	const_iterator begin(void) const
 -	{ return buf; }
 -	
 -	iterator end(void)
 -	{ return buf + lenBuf; }
 -
 -	const_iterator end(void) const
 -	{ return buf + lenBuf; }
 -	  
 -	// Custom extentions
 -
 -	void appendfmt(const value_type *fmt, ...);
 -
 -	size_type sizebytes(void) const { return lenBuf * sizeof(value_type); }
 -};
 -
 -//const bkstring::size_type bkstring::npos = -1;
 diff --git a/plugins/SmileyAdd/src/customsmiley.cpp b/plugins/SmileyAdd/src/customsmiley.cpp index a41920d140..8dd946429d 100644 --- a/plugins/SmileyAdd/src/customsmiley.cpp +++ b/plugins/SmileyAdd/src/customsmiley.cpp @@ -64,7 +64,7 @@ SmileyPackCType* SmileyPackCListType::GetSmileyPack(HANDLE id)  }
 -SmileyCType::SmileyCType(const bkstring& fullpath, const TCHAR* filepath)
 +SmileyCType::SmileyCType(const CMString& fullpath, const TCHAR* filepath)
  {
  	LoadFromResource(fullpath, 0); 
  	CreateTriggerText(T2A_SM(filepath));
 @@ -101,7 +101,7 @@ bool SmileyCType::CreateTriggerText(char* text)  bool SmileyPackCType::LoadSmileyDir(TCHAR* dir)
  {
 -	bkstring dirs = dir;
 +	CMString dirs = dir;
  	dirs += _T("\\*.*");
  	_tfinddata_t c_file;
 @@ -111,14 +111,14 @@ bool SmileyPackCType::LoadSmileyDir(TCHAR* dir)  		do {
  			if (c_file.name[0] != '.')
  			{
 -				bkstring fullpath = dir;
 +				CMString fullpath = dir;
  				fullpath = fullpath + _T("\\") + c_file.name;
  				TCHAR* div = _tcsrchr(c_file.name, '.');
  				if (div)
  				{
  					*div = 0;
  					SmileyCType *smlc = new SmileyCType(fullpath, c_file.name);
 -					if (smlc->GetTriggerText().empty())
 +					if (smlc->GetTriggerText().IsEmpty())
  						delete smlc;
  					else
  						m_SmileyList.insert(smlc);
 @@ -135,11 +135,11 @@ bool SmileyPackCType::LoadSmileyDir(TCHAR* dir)  bool SmileyPackCType::LoadSmiley(TCHAR* path)
  {
 -	bkstring dirs = path;
 -	bkstring::size_type slash = dirs.find_last_of('\\');
 -	bkstring::size_type dot = dirs.find_last_of('.');
 +	CMString dirs = path;
 +	int slash = dirs.ReverseFind('\\');
 +	int dot = dirs.ReverseFind('.');
 -	bkstring name = dirs.substr(slash+1, dot - slash - 1); 
 +	CMString name = dirs.Mid(slash+1, dot - slash - 1); 
  	for (int i=0; i < m_SmileyList.getCount(); i++) {
  		if (m_SmileyList[i].GetTriggerText() == name) {
 @@ -150,7 +150,7 @@ bool SmileyPackCType::LoadSmiley(TCHAR* path)  	m_SmileyList.insert(new SmileyCType(dirs, (TCHAR*)name.c_str()));
 -	bkstring empty;
 +	CMString empty;
  	m_SmileyLookup.insert(new SmileyLookup(
  		m_SmileyList[m_SmileyList.getCount()-1].GetTriggerText(), false, m_SmileyList.getCount()-1, empty));
 @@ -160,7 +160,7 @@ bool SmileyPackCType::LoadSmiley(TCHAR* path)  void SmileyPackCType::AddTriggersToSmileyLookup(void)
  {
 -	bkstring empty;
 +	CMString empty;
  	for (int dist=0; dist<m_SmileyList.getCount(); dist++) {
  		SmileyLookup *dats = new SmileyLookup(m_SmileyList[dist].GetTriggerText(), false, dist, empty); 
  		m_SmileyLookup.insert(dats);
 diff --git a/plugins/SmileyAdd/src/customsmiley.h b/plugins/SmileyAdd/src/customsmiley.h index 594595977a..c613b5dc75 100644 --- a/plugins/SmileyAdd/src/customsmiley.h +++ b/plugins/SmileyAdd/src/customsmiley.h @@ -22,7 +22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  class SmileyCType : public SmileyType
  {
  public:
 -	SmileyCType(const bkstring& fullpath, const TCHAR* filepath);
 +	SmileyCType(const CMString& fullpath, const TCHAR* filepath);
  	bool CreateTriggerText(char* text);
  };
 @@ -39,7 +39,7 @@ private:  	HANDLE m_id;
 -	void InsertLookup(SmileyCType& sml, bkstring& lk, bool first);
 +	void InsertLookup(SmileyCType& sml, CMString& lk, bool first);
  	void AddTriggersToSmileyLookup(void);
  public:
 diff --git a/plugins/SmileyAdd/src/download.cpp b/plugins/SmileyAdd/src/download.cpp index fcb4a06139..c3a68a11d3 100644 --- a/plugins/SmileyAdd/src/download.cpp +++ b/plugins/SmileyAdd/src/download.cpp @@ -23,11 +23,11 @@ static HANDLE hFolder;  struct QueueElem
  {
 -	bkstring url;
 -	bkstring fname;
 +	CMString url;
 +	CMString fname;
  	bool needext;
 -	QueueElem(bkstring& purl, bkstring& pfname, bool ne)
 +	QueueElem(CMString& purl, CMString& pfname, bool ne)
  		: url(purl), fname(pfname), needext(ne) {}
  };
 @@ -58,26 +58,22 @@ bool InternetDownloadFile(const char *szUrl, char* szDest, HANDLE &hHttpDwnl)  	nlhr.headers[1].szName  = "Connection";
  	nlhr.headers[1].szValue = "close";
 -	while (result == 0xBADBAD)
 -	{
 +	while (result == 0xBADBAD) {
  		// download the page
  		NETLIBHTTPREQUEST *nlhrReply = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,
  			(WPARAM)hNetlibUser,(LPARAM)&nlhr);
 -		if (nlhrReply)
 -		{
 +		if (nlhrReply) {
  			hHttpDwnl = nlhrReply->nlc;
  			// if the recieved code is 200 OK
 -			if(nlhrReply->resultCode == 200)
 -			{
 -				char* delim = strrchr(szDest, '\\');
 +			if (nlhrReply->resultCode == 200) {
 +				char *delim = strrchr(szDest, '\\');
  				if (delim) *delim = '\0';
  				CreateDirectoryTree(szDest);
  				if (delim) *delim = '\\';
  				int res = -1;
  				int fh = _open(szDest, _O_BINARY | _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE);
 -				if (fh != -1)
 -				{
 +				if (fh != -1) {
  					res = _write(fh, nlhrReply->pData, nlhrReply->dataLength);
  					_close(fh);
  				}
 @@ -88,17 +84,13 @@ bool InternetDownloadFile(const char *szUrl, char* szDest, HANDLE &hHttpDwnl)  			}
  			// if the recieved code is 302 Moved, Found, etc
  			// workaround for url forwarding
 -			else if(nlhrReply->resultCode == 302 || nlhrReply->resultCode == 301 || nlhrReply->resultCode == 307) // page moved
 -			{
 +			else if (nlhrReply->resultCode == 302 || nlhrReply->resultCode == 301 || nlhrReply->resultCode == 307) { // page moved
  				// get the url for the new location and save it to szInfo
  				// look for the reply header "Location"
 -				for (int i=0; i<nlhrReply->headersCount; i++)
 -				{
 -					if (!strcmp(nlhrReply->headers[i].szName, "Location"))
 -					{
 +				for (int i=0; i<nlhrReply->headersCount; i++) {
 +					if (!strcmp(nlhrReply->headers[i].szName, "Location")) {
  						size_t rlen = 0;
 -						if (nlhrReply->headers[i].szValue[0] == '/')
 -						{
 +						if (nlhrReply->headers[i].szValue[0] == '/') {
  							const char* szPath;
  							const char* szPref = strstr(szUrl, "://");
  							szPref = szPref ? szPref + 3 : szUrl;
 @@ -106,8 +98,7 @@ bool InternetDownloadFile(const char *szUrl, char* szDest, HANDLE &hHttpDwnl)  							rlen = szPath != NULL ? szPath - szUrl : strlen(szUrl);
  						}
 -						szRedirUrl = (char*)mir_realloc(szRedirUrl,
 -							rlen + strlen(nlhrReply->headers[i].szValue)*3 + 1);
 +						szRedirUrl = (char*)mir_realloc(szRedirUrl, rlen + strlen(nlhrReply->headers[i].szValue)*3 + 1);
  						strncpy(szRedirUrl, szUrl, rlen);
  						strcpy(szRedirUrl+rlen, nlhrReply->headers[i].szValue);
 @@ -117,11 +108,9 @@ bool InternetDownloadFile(const char *szUrl, char* szDest, HANDLE &hHttpDwnl)  					}
  				}
  			}
 -			else
 -				result = 1;
 +			else result = 1;
  		}
 -		else
 -		{
 +		else {
  			hHttpDwnl = NULL;
  			result = 1;
  		}
 @@ -146,7 +135,7 @@ void __cdecl SmileyDownloadThread(void*)  			InternetDownloadFile(T2A_SM(dlQueue[0].url.c_str()), T2A_SM(dlQueue[0].fname.c_str()), hHttpDwnl);
  			WaitForSingleObject(g_hDlMutex, 3000);
 -			bkstring fname(dlQueue[0].fname);
 +			CMString fname(dlQueue[0].fname);
  			if (dlQueue[0].needext) { fname += GetImageExt(fname); needext = true; }
  			_trename(dlQueue[0].fname.c_str(), fname.c_str());
  		}
 @@ -159,8 +148,7 @@ void __cdecl SmileyDownloadThread(void*)  	threadRunning = false;
  	ReleaseMutex(g_hDlMutex);
 -	if (!Miranda_Terminated())
 -	{
 +	if (!Miranda_Terminated()) {
  		if (needext)
  			CallServiceSync(MS_SMILEYADD_RELOAD, 0, 0);
  		else
 @@ -168,42 +156,42 @@ void __cdecl SmileyDownloadThread(void*)  	}
  }
 -bool GetSmileyFile(bkstring& url, const bkstring& packstr)
 +bool GetSmileyFile(CMString& url, const CMString& packstr)
  {
 -	_TPattern * urlsplit = _TPattern::compile(_T(".*/(.*)"));
 -	_TMatcher * m0 = urlsplit->createTMatcher(url);
 +	_TPattern *urlsplit = _TPattern::compile(_T(".*/(.*)"));
 +	_TMatcher *m0 = urlsplit->createTMatcher(url);
  	m0->findFirstMatch();
 -	bkstring filename;
 -	filename.appendfmt(_T("%s\\%s\\"), cachepath, packstr.c_str());
 -	size_t pathpos = filename.size();
 +	CMString filename;
 +	filename.AppendFormat(_T("%s\\%s\\"), cachepath, packstr.c_str());
 +	int pathpos = filename.GetLength();
  	filename += m0->getGroup(1);
  	delete m0;
  	delete urlsplit;
 -	bool needext = filename.find('.') == filename.npos;
 -	if (needext) filename += _T(".*");
 +	bool needext = filename.Find('.') == -1;
 +	if (needext)
 +		filename += _T(".*");
  	_tfinddata_t c_file;
  	INT_PTR hFile = _tfindfirst((TCHAR*)filename.c_str(), &c_file);
 -	if (hFile > -1)
 -	{
 +	if (hFile > -1) {
  		_findclose(hFile);
 -		filename.erase(pathpos);
 +		filename.Truncate(pathpos);
  		filename += c_file.name;
  		url = filename;
  		return false;
  	}
 -	if (needext) filename.erase(filename.size()-1);
 +	if (needext)
 +		filename.Truncate(filename.GetLength() - 1);
  	WaitForSingleObject(g_hDlMutex, 3000);
  	dlQueue.insert(new QueueElem(url, filename, needext));
  	ReleaseMutex(g_hDlMutex);
 -	if (!threadRunning)
 -	{
 +	if (!threadRunning) {
  		threadRunning = true;
  		mir_forkthread(SmileyDownloadThread, NULL);
  	}
 @@ -225,19 +213,13 @@ void GetSmileyCacheFolder(void)  		FoldersGetCustomPathT(hFolder, cachepath, MAX_PATH, _T(""));
  		HookEvent(ME_FOLDERS_PATH_CHANGED, FolderChanged);
  	}
 -	else
 -	{
 -		TCHAR* tszFolder = Utils_ReplaceVarsT(_T("%miranda_userdata%\\SmileyCache"));
 -		lstrcpyn(cachepath, tszFolder, MAX_PATH);
 -		mir_free(tszFolder);
 -	}
 +	else lstrcpyn(cachepath, VARST( _T("%miranda_userdata%\\SmileyCache")), MAX_PATH);
  }
  void DownloadInit(void)
  {
 -	NETLIBUSER nlu = {0};
 -	nlu.cbSize = sizeof(nlu);
 -	nlu.flags = NUF_OUTGOING|NUF_HTTPCONNS|NUF_NOHTTPSOPTION|NUF_TCHAR;
 +	NETLIBUSER nlu = { sizeof(nlu) };
 +	nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_NOHTTPSOPTION | NUF_TCHAR;
  	nlu.szSettingsModule = "SmileyAdd";
  	nlu.ptszDescriptiveName = TranslateT("SmileyAdd HTTP connections");
  	hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu);
 diff --git a/plugins/SmileyAdd/src/download.h b/plugins/SmileyAdd/src/download.h index 977a98ef96..8bc7daec85 100644 --- a/plugins/SmileyAdd/src/download.h +++ b/plugins/SmileyAdd/src/download.h @@ -19,7 +19,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #ifndef SMILEYADD_DOWNLOAD_H_
  #define SMILEYADD_DOWNLOAD_H_
 -bool GetSmileyFile(bkstring& url, const bkstring& packstr);
 +bool GetSmileyFile(CMString& url, const CMString& packstr);
  void DownloadInit(void);
  void DownloadClose(void);
 diff --git a/plugins/SmileyAdd/src/general.cpp b/plugins/SmileyAdd/src/general.cpp index 0fa8cc9612..2d736ae9e8 100644 --- a/plugins/SmileyAdd/src/general.cpp +++ b/plugins/SmileyAdd/src/general.cpp @@ -68,7 +68,7 @@ HICON GetDefaultIcon(bool copy)  }
 -const TCHAR* GetImageExt(bkstring &fname)
 +const TCHAR* GetImageExt(CMString &fname)
  {
  	const TCHAR* ext = _T("");
 @@ -139,14 +139,14 @@ HICON ImageList_GetIconFixed (HIMAGELIST himl, INT i, UINT fStyle)  	return hIcon;
  }
 -void pathToRelative(const bkstring& pSrc, bkstring& pOut)
 +void pathToRelative(const CMString& pSrc, CMString& pOut)
  {
  	TCHAR szOutPath[MAX_PATH];
  	PathToRelativeT(pSrc.c_str(), szOutPath);
  	pOut = szOutPath;
  }
 -void pathToAbsolute(const bkstring& pSrc, bkstring& pOut) 
 +void pathToAbsolute(const CMString& pSrc, CMString& pOut) 
  {
  	TCHAR szOutPath[MAX_PATH];
 diff --git a/plugins/SmileyAdd/src/general.h b/plugins/SmileyAdd/src/general.h index cb268cdfc7..302d898f18 100644 --- a/plugins/SmileyAdd/src/general.h +++ b/plugins/SmileyAdd/src/general.h @@ -60,13 +60,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include <m_icolib.h>
  #include <m_genmenu.h>
  #include <m_imgsrvc.h>
 +#include <m_string.h>
  #include <m_metacontacts.h>
  #include <m_smileyadd.h>
  #include <m_smileyadd_deprecated.h>
  #include <m_folders.h>
 -#include "bkstring.h"
  #include "regexp\wcpattern.h"
  #include "regexp\wcmatcher.h"
 @@ -171,15 +171,15 @@ bool IsOldSrmm(void);  //functions for general use (defined in general.cpp)
  int CalculateTextHeight(HDC hdc, CHARFORMAT2* chf);
 -const TCHAR* GetImageExt(bkstring &fname);
 +const TCHAR* GetImageExt(CMString &fname);
  HANDLE DecodeMetaContact(HANDLE hContact);
  bool IsSmileyProto(char* proto);
  HICON ImageList_GetIconFixed (HIMAGELIST himl, INT i, UINT fStyle);
 -void pathToRelative(const bkstring& pSrc, bkstring& pOut);
 -void pathToAbsolute(const bkstring& pSrc, bkstring& pOut);
 +void pathToRelative(const CMString& pSrc, CMString& pOut);
 +void pathToAbsolute(const CMString& pSrc, CMString& pOut);
  bool InitGdiPlus(void);
  void DestroyGdiPlus(void);
 diff --git a/plugins/SmileyAdd/src/imagecache.cpp b/plugins/SmileyAdd/src/imagecache.cpp index 9d6fff549c..87b95f5a60 100644 --- a/plugins/SmileyAdd/src/imagecache.cpp +++ b/plugins/SmileyAdd/src/imagecache.cpp @@ -23,7 +23,7 @@ static FI_INTERFACE *fei;  static HANDLE g_hMutexIm;
  static OBJLIST<ImageBase> g_imagecache(25, ImageType::CompareImg);
 -static bkstring lastdllname;
 +static CMString lastdllname;
  static HMODULE lastmodule;
  static time_t laststamp;
  static UINT_PTR timerId;
 @@ -36,7 +36,7 @@ static void CALLBACK timerProc(HWND, UINT, UINT_PTR, DWORD)  	{
  		FreeLibrary(lastmodule);
  		lastmodule = NULL;
 -		lastdllname.clear();
 +		lastdllname.Empty();
  	}
  	for (int i=g_imagecache.getCount()-1; i >= 0; i--)
 @@ -61,7 +61,7 @@ static void CALLBACK sttMainThreadCallback( PVOID )  }
 -static HMODULE LoadDll(const bkstring& file)
 +static HMODULE LoadDll(const CMString& file)
  {
  	WaitForSingleObject(g_hMutexIm, 3000);
 @@ -198,7 +198,7 @@ int ImageBase::SelectNextFrame(const int frame) -IconType::IconType(const unsigned id, const bkstring& file, const int index, const IcoTypeEnum type)
 +IconType::IconType(const unsigned id, const CMString& file, const int index, const IcoTypeEnum type)
  	: ImageBase(id)
  {
  	m_SmileyIcon = NULL;
 @@ -288,7 +288,7 @@ void ImageListItemType::GetSize(SIZE& size)  	ImageList_GetIconSize(m_hImList, (int*)&size.cx, (int*)&size.cy);
  }
 -ImageType::ImageType(const unsigned id, const bkstring& file, IStream* pStream)
 +ImageType::ImageType(const unsigned id, const CMString& file, IStream* pStream)
  	: ImageBase(id)
  {
  	m_bmp           = NULL;
 @@ -321,7 +321,7 @@ ImageType::ImageType(const unsigned id, const bkstring& file, IStream* pStream)  	}
  }
 -ImageType::ImageType(const unsigned id, const bkstring& file, const int index, const IcoTypeEnum type)
 +ImageType::ImageType(const unsigned id, const CMString& file, const int index, const IcoTypeEnum type)
  	: ImageBase(id)
  {
  	m_bmp           = NULL;
 @@ -437,7 +437,7 @@ ImageFType::ImageFType(const unsigned id)  	m_bmp = NULL;
  }
 -ImageFType::ImageFType(const unsigned id, const bkstring& file)
 +ImageFType::ImageFType(const unsigned id, const CMString& file)
  	: ImageBase(id)
  {
  	m_bmp = NULL;
 @@ -589,7 +589,7 @@ void ImageFType::GetSize(SIZE& size)  	}
  }
  /*
 -ImageFAniType::ImageFAniType(const unsigned id, const bkstring& file)
 +ImageFAniType::ImageFAniType(const unsigned id, const CMString& file)
  : ImageFType(id)
  {
  	m_fmbmp = NULL;
 @@ -720,10 +720,10 @@ void DestroyImageCache(void)  }
 -ImageBase* AddCacheImage(const bkstring& file, int index)
 +ImageBase* AddCacheImage(const CMString& file, int index)
  {
 -	bkstring tmpfile(file); tmpfile.appendfmt(_T("#%d"), index);
 -	unsigned id = hash(tmpfile.c_str(), (unsigned int)tmpfile.size() * sizeof(TCHAR));
 +	CMString tmpfile(file); tmpfile.AppendFormat(_T("#%d"), index);
 +	unsigned id = hash(tmpfile.c_str(), (unsigned int)tmpfile.GetLength() * sizeof(TCHAR));
  	WaitForSingleObject(g_hMutexIm, 3000);
 @@ -731,19 +731,21 @@ ImageBase* AddCacheImage(const bkstring& file, int index)  	ImageBase *img = g_imagecache.find(&srch);
  	if (img == NULL)
  	{
 -		bkstring::size_type ind = file.find_last_of('.');
 -		if (ind == file.npos) return NULL;
 -		bkstring ext = file.substr(ind+1);
 +		int ind = file.ReverseFind('.');
 +		if (ind == -1)
 +			return NULL;
 -		if (ext.comparei(_T("dll")) == 0 || ext.comparei(_T("exe")) == 0)
 +		CMString ext = file.Right(ind+1);
 +		ext.MakeLower();
 +		if (ext == _T("dll") || ext == _T("exe"))
  			img = opt.HQScaling ? (ImageBase*)new ImageType(id, file, index, icoDll) : (ImageBase*)new IconType(id, file, index, icoDll);
 -		else if (ext.comparei(_T("ico")) == 0)
 +		else if (ext == _T("ico"))
  			img = opt.HQScaling ? (ImageBase*)new ImageType(id, file, 0, icoFile) : (ImageBase*)new IconType(id, file, 0, icoFile);
 -		else if (ext.comparei(_T("icl")) == 0)
 +		else if (ext == _T("icl"))
  			img = opt.HQScaling ? (ImageBase*)new ImageType(id, file, index, icoIcl) : (ImageBase*)new IconType(id, file, index, icoIcl);
 -		else if (ext.comparei(_T("gif")) == 0)
 +		else if (ext == _T("gif"))
  			img = new ImageType(id, file, NULL);
 -		else if (fei == NULL || ext.comparei(_T("tif")) == 0 || ext.comparei(_T("tiff")) == 0)
 +		else if (fei == NULL || ext == _T("tif") || ext == _T("tiff"))
  			img = new ImageType(id, file, NULL);
  		else
  			img = opt.HQScaling ? (ImageBase*)new ImageType(id, file, NULL) : (ImageBase*)new ImageFType(id, file);
 diff --git a/plugins/SmileyAdd/src/imagecache.h b/plugins/SmileyAdd/src/imagecache.h index 87e04bafd0..d8abe2e6b6 100644 --- a/plugins/SmileyAdd/src/imagecache.h +++ b/plugins/SmileyAdd/src/imagecache.h @@ -66,7 +66,7 @@ private:  	HICON m_SmileyIcon;
  public:
 -	IconType(const unsigned id, const bkstring& file, const int index, const IcoTypeEnum type);
 +	IconType(const unsigned id, const CMString& file, const int index, const IcoTypeEnum type);
  	~IconType();
  	void DrawInternal(HDC dc, int x, int y, int sizeX, int sizeY);
 @@ -101,8 +101,8 @@ private:  public:
 -	ImageType(const unsigned id, const bkstring& file, IStream* pStream);
 -    ImageType(const unsigned id, const bkstring& file, const int index, const IcoTypeEnum type);
 +	ImageType(const unsigned id, const CMString& file, IStream* pStream);
 +    ImageType(const unsigned id, const CMString& file, const int index, const IcoTypeEnum type);
  	~ImageType();
      void SelectFrame(int frame);
 @@ -123,7 +123,7 @@ protected:  public:
      ImageFType(const unsigned id);
 -	ImageFType(const unsigned id, const bkstring& file);
 +	ImageFType(const unsigned id, const CMString& file);
  	~ImageFType();
  	void DrawInternal(HDC dc, int x, int y, int sizeX, int sizeY);
 @@ -143,7 +143,7 @@ private:  public:
 -	ImageFAniType(const unsigned id, const bkstring& file);
 +	ImageFAniType(const unsigned id, const CMString& file);
  	~ImageFAniType();
      void SelectFrame(int frame);
 @@ -154,7 +154,7 @@ public:  */
 -ImageBase* AddCacheImage(const bkstring& file, int index);
 +ImageBase* AddCacheImage(const CMString& file, int index);
  void InitImageCache(void);
  void DestroyImageCache(void);
 diff --git a/plugins/SmileyAdd/src/options.cpp b/plugins/SmileyAdd/src/options.cpp index 62e1668848..90daa34791 100644 --- a/plugins/SmileyAdd/src/options.cpp +++ b/plugins/SmileyAdd/src/options.cpp @@ -265,10 +265,9 @@ void OptionsDialogType::AddCategory(void)  	TCHAR cat[30];
  	GetDlgItemText(m_hwndDialog, IDC_NEWCATEGORY, cat, SIZEOF(cat)); 
 -	bkstring catd = cat;
 +	CMString catd = cat;
 -	if (!catd.empty())
 -	{
 +	if (!catd.IsEmpty()) {
  		tmpsmcat.AddCategory(cat, catd, smcCustom);
  		PopulateSmPackList();
 @@ -281,17 +280,11 @@ void OptionsDialogType::UserAction(HTREEITEM hItem)  {
  	HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
 -	if (TreeView_GetCheckState(hLstView, hItem))
 -	{
 +	if (TreeView_GetCheckState(hLstView, hItem)) {
  		if (!BrowseForSmileyPacks(GetSelProto(hItem)))
 -		{
  			TreeView_SetCheckState(hLstView, hItem, TRUE)
 -		}
 -	}
 -	else
 -	{
 -		tmpsmcat.GetSmileyCategory(GetSelProto(hItem))->ClearFilename();
  	}
 +	else tmpsmcat.GetSmileyCategory(GetSelProto(hItem))->ClearFilename();
  	if (hItem == TreeView_GetSelection(hLstView))
  		UpdateControls();
 @@ -313,14 +306,12 @@ void OptionsDialogType::UpdateControls(bool force)  	const SmileyCategoryType* smc = tmpsmcat.GetSmileyCategory(GetSelProto());
  	if (smc == NULL) return;
 -	const bkstring& smf = smc->GetFilename();
 +	const CMString& smf = smc->GetFilename();
  	SetDlgItemText(m_hwndDialog, IDC_FILENAME, smf.c_str());
  	if (smPack.GetFilename() != smf || force)
 -	{
  		smPack.LoadSmileyFile(smf, false, true);
 -	}
  	HWND hLstView = GetDlgItem(m_hwndDialog, IDC_CATEGORYLIST);
  	TreeView_SetCheckState(hLstView, TreeView_GetSelection(hLstView), smPack.SmileyCount() != 0);
 @@ -485,7 +476,7 @@ void OptionsDialogType::ApplyChanges(void)  	SmileyCategoryListType::SmileyCategoryVectorType& smc = *g_SmileyCategories.GetSmileyCategoryList();
  	for (int i=0; i < smc.getCount(); i++) {
  		if (tmpsmcat.GetSmileyCategory(smc[i].GetName()) == NULL) {
 -			bkstring empty;
 +			CMString empty;
  			opt.WritePackFileName(empty, smc[i].GetName());
  		}
  	}
 @@ -508,13 +499,13 @@ bool OptionsDialogType::BrowseForSmileyPacks(int item)  	ofn.lpstrFile = filename;
  	ofn.nMaxFile = SIZEOF(filename);
 -	bkstring inidir;
 +	CMString inidir;
  	SmileyCategoryType* smc = tmpsmcat.GetSmileyCategory(item); 
 -	if (smc->GetFilename().empty())
 +	if (smc->GetFilename().IsEmpty())
  		pathToAbsolute(_T("Smileys"), inidir);
  	else {
  		pathToAbsolute(smc->GetFilename(), inidir);
 -		inidir.erase(inidir.find_last_of('\\'));
 +		inidir.Truncate(inidir.ReverseFind('\\'));
  	}
  	ofn.lpstrInitialDir = inidir.c_str();
 @@ -540,7 +531,7 @@ bool OptionsDialogType::BrowseForSmileyPacks(int item)  	ofn.lpstrDefExt = _T("msl");
  	if (GetOpenFileName(&ofn)) {
 -		bkstring relpath;
 +		CMString relpath;
  		pathToRelative(filename, relpath);
  		smc->SetFilename(relpath);
 @@ -557,7 +548,7 @@ void OptionsDialogType::FilenameChanged(void)  	SmileyCategoryType* smc = tmpsmcat.GetSmileyCategory(GetSelProto()); 
  	if (smc->GetFilename() != str) {
 -		bkstring temp(str);
 +		CMString temp(str);
  		smc->SetFilename(temp);
  		UpdateControls();
  	}
 @@ -627,9 +618,9 @@ void OptionsType::Load(void)  }
 -void OptionsType::ReadPackFileName(bkstring& filename, const bkstring& name, const bkstring& defaultFilename)
 +void OptionsType::ReadPackFileName(CMString& filename, const CMString& name, const CMString& defaultFilename)
  {
 -	bkstring settingKey = name + _T("-filename");
 +	CMString settingKey = name + _T("-filename");
  	DBVARIANT dbv;
  	if (!db_get_ts(NULL, "SmileyAdd", T2A_SM(settingKey.c_str()), &dbv)) {
 @@ -639,15 +630,15 @@ void OptionsType::ReadPackFileName(bkstring& filename, const bkstring& name, con  	else filename = defaultFilename;
  }
 -void OptionsType::WritePackFileName(const bkstring& filename, const bkstring& name)
 +void OptionsType::WritePackFileName(const CMString& filename, const CMString& name)
  {
 -	bkstring settingKey = name + _T("-filename");
 +	CMString settingKey = name + _T("-filename");
  	db_set_ts(NULL, "SmileyAdd", T2A_SM(settingKey.c_str()), 
  		filename.c_str());
  }
 -void OptionsType::ReadCustomCategories(bkstring& cats)
 +void OptionsType::ReadCustomCategories(CMString& cats)
  {
  	DBVARIANT dbv;
 @@ -660,16 +651,16 @@ void OptionsType::ReadCustomCategories(bkstring& cats)  }
 -void OptionsType::WriteCustomCategories(const bkstring& cats)
 +void OptionsType::WriteCustomCategories(const CMString& cats)
  {
 -	if (cats.empty())
 +	if (cats.IsEmpty())
  		db_unset(NULL, "SmileyAdd", "CustomCategories");
  	else
  		db_set_ts(NULL, "SmileyAdd", "CustomCategories",	cats.c_str());
  }
 -void OptionsType::ReadContactCategory(HANDLE hContact, bkstring& cats)
 +void OptionsType::ReadContactCategory(HANDLE hContact, CMString& cats)
  {
  	DBVARIANT dbv;
 @@ -682,9 +673,9 @@ void OptionsType::ReadContactCategory(HANDLE hContact, bkstring& cats)  }
 -void OptionsType::WriteContactCategory(HANDLE hContact, const bkstring& cats)
 +void OptionsType::WriteContactCategory(HANDLE hContact, const CMString& cats)
  {
 -	if (cats.empty())
 +	if (cats.IsEmpty())
  		db_unset(hContact, "SmileyAdd", "CustomCategory");
  	else
  		db_set_ts(hContact, "SmileyAdd", "CustomCategory",	cats.c_str());
 diff --git a/plugins/SmileyAdd/src/options.h b/plugins/SmileyAdd/src/options.h index 3b83b0dc8f..349fe2f9dd 100644 --- a/plugins/SmileyAdd/src/options.h +++ b/plugins/SmileyAdd/src/options.h @@ -45,13 +45,13 @@ public:  	void Load(void);
  	void Save(void);
 -	static void ReadPackFileName(bkstring& filename, const bkstring& name, 
 -		const bkstring& defaultFilename);
 -	static void ReadCustomCategories(bkstring& cats);
 -	static void ReadContactCategory(HANDLE hContact, bkstring& cats);
 -	static void WritePackFileName(const bkstring& filename, const bkstring& name);
 -	static void WriteCustomCategories(const bkstring& cats);
 -	static void WriteContactCategory(HANDLE hContact, const bkstring& cats);
 +	static void ReadPackFileName(CMString& filename, const CMString& name, 
 +		const CMString& defaultFilename);
 +	static void ReadCustomCategories(CMString& cats);
 +	static void ReadContactCategory(HANDLE hContact, CMString& cats);
 +	static void WritePackFileName(const CMString& filename, const CMString& name);
 +	static void WriteCustomCategories(const CMString& cats);
 +	static void WriteContactCategory(HANDLE hContact, const CMString& cats);
  };
  extern OptionsType opt;
 diff --git a/plugins/SmileyAdd/src/regexp/WCMatcher.cpp b/plugins/SmileyAdd/src/regexp/WCMatcher.cpp index d74fc9f9b5..354c474bdd 100644 --- a/plugins/SmileyAdd/src/regexp/WCMatcher.cpp +++ b/plugins/SmileyAdd/src/regexp/WCMatcher.cpp @@ -8,173 +8,172 @@ const int WCMatcher::MATCH_ENTIRE_STRING = 0x01;    @author   Jeffery Stuart
    @since    November 2004
    @version  1.07.00
 -*/
 +  */
 -WCMatcher::WCMatcher(WCPattern * pattern, const bkstring & text)
 +WCMatcher::WCMatcher(WCPattern * pattern, const CMString & text)
  {
 -  pat = pattern;
 -  str = &text;
 -  gc = pattern->groupCount;
 -  ncgc = -pattern->nonCapGroupCount;
 -  flags = 0;
 -  matchedSomething = false;
 -  starts        = new int[gc + ncgc];
 -  ends          = new int[gc + ncgc];
 -  groups        = new int[gc + ncgc];
 -  groupPos      = new int[gc + ncgc];
 -  groupIndeces  = new int[gc + ncgc];
 -  starts        = starts        + ncgc;
 -  ends          = ends          + ncgc;
 -  groups        = groups        + ncgc;
 -  groupPos      = groupPos      + ncgc;
 -  groupIndeces  = groupIndeces  + ncgc;
 -  for (int i = 0; i < gc; ++i) starts[i] = ends[i] = 0;
 +	pat = pattern;
 +	str = &text;
 +	gc = pattern->groupCount;
 +	ncgc = -pattern->nonCapGroupCount;
 +	flags = 0;
 +	matchedSomething = false;
 +	starts = new int[gc + ncgc];
 +	ends = new int[gc + ncgc];
 +	groups = new int[gc + ncgc];
 +	groupPos = new int[gc + ncgc];
 +	groupIndeces = new int[gc + ncgc];
 +	starts = starts + ncgc;
 +	ends = ends + ncgc;
 +	groups = groups + ncgc;
 +	groupPos = groupPos + ncgc;
 +	groupIndeces = groupIndeces + ncgc;
 +	for (int i = 0; i < gc; ++i) starts[i] = ends[i] = 0;
  }
  WCMatcher::~WCMatcher()
  {
 -  delete [] (starts       - ncgc);
 -  delete [] (ends         - ncgc);
 -  delete [] (groups       - ncgc);
 -  delete [] (groupIndeces - ncgc);
 -  delete [] (groupPos     - ncgc);
 +	delete[](starts - ncgc);
 +	delete[](ends - ncgc);
 +	delete[](groups - ncgc);
 +	delete[](groupIndeces - ncgc);
 +	delete[](groupPos - ncgc);
  }
  void WCMatcher::clearGroups()
  {
 -  int i;
 -  lm = 0;
 -  for (i = 0; i < gc; ++i)    groups[i] = starts[i] = ends[i] = -1;
 -  for (i = 1; i <= ncgc; ++i) groups[0 - i] = starts[0 - i] = ends[0 - i] = -1;
 +	int i;
 +	lm = 0;
 +	for (i = 0; i < gc; ++i)    groups[i] = starts[i] = ends[i] = -1;
 +	for (i = 1; i <= ncgc; ++i) groups[0 - i] = starts[0 - i] = ends[0 - i] = -1;
  }
 -bkstring WCMatcher::replaceWithGroups(const bkstring & str)
 +CMString WCMatcher::replaceWithGroups(const CMString & str)
  {
 -  bkstring ret = L"";
 -
 -  bkstring t = str;
 -  while (t.size() > 0)
 -  {
 -    if (t[0] == (wchar_t)'\\')
 -    {
 -      t.erase(0, 1);
 -      if (t.size() == 0)
 -      {
 -        ret += L"\\";
 -      }
 -      else if (t[0] < (wchar_t)'0' || t[0] > (wchar_t)'9')
 -      {
 -        ret += t[0];
 -        t.erase(0, 1);
 -      }
 -      else
 -      {
 -        int gn = 0;
 -        while (t.size() > 0 && t[0] >= (wchar_t)'0' && t[0] <= (wchar_t)'9')
 -        {
 -          gn = gn * 10 + (t[0] - (wchar_t)'0');
 -          t.erase(0, 1);
 -        }
 -        ret += getGroup(gn);
 -      }
 -    }
 -    else
 -    {
 -      ret += t[0];
 -      t.erase(0, 1);
 -    }
 -  }
 -
 -  return ret;
 +	CMString ret = L"";
 +
 +	CMString t = str;
 +	while (t.GetLength() > 0)
 +	{
 +		if (t[0] == '\\')
 +		{
 +			t.Delete(0);
 +			if (t.GetLength() == 0)
 +				ret += L"\\";
 +			else if (t[0] < '0' || t[0] > '9') {
 +				ret += t[0];
 +				t.Delete(0);
 +			}
 +			else {
 +				int gn = 0;
 +				while (t.GetLength() > 0 && t[0] >= '0' && t[0] <= '9')
 +				{
 +					gn = gn * 10 + (t[0] - '0');
 +					t.Delete(0);
 +				}
 +				ret += getGroup(gn);
 +			}
 +		}
 +		else {
 +			ret += t[0];
 +			t.Delete(0);
 +		}
 +	}
 +
 +	return ret;
  }
  unsigned long WCMatcher::getFlags() const
  {
 -  return flags;
 +	return flags;
  }
 -const bkstring& WCMatcher::getText() const
 +const CMString& WCMatcher::getText() const
  {
 -  return *str;
 +	return *str;
  }
  bool WCMatcher::matches()
  {
 -  flags = MATCH_ENTIRE_STRING;
 -  matchedSomething = false;
 -  clearGroups();
 -  lm = 0;
 -  return pat->head->match(*str, this, 0) == (int)str->size();
 +	flags = MATCH_ENTIRE_STRING;
 +	matchedSomething = false;
 +	clearGroups();
 +	lm = 0;
 +	return pat->head->match(*str, this, 0) == (int)str->GetLength();
  }
 +
  bool WCMatcher::findFirstMatch()
  {
 -  starts[0] = 0;
 -  flags = 0;
 -  clearGroups();
 -  start = 0;
 -  lm = 0;
 -  ends[0] = pat->head->match(*str, this, 0);
 -  if (ends[0] >= 0)
 -  {
 -    matchedSomething = true;
 -    return 1;
 -  }
 -  return 0;
 +	starts[0] = 0;
 +	flags = 0;
 +	clearGroups();
 +	start = 0;
 +	lm = 0;
 +	ends[0] = pat->head->match(*str, this, 0);
 +	if (ends[0] >= 0)
 +	{
 +		matchedSomething = true;
 +		return 1;
 +	}
 +	return 0;
  }
 +
  bool WCMatcher::findNextMatch()
  {
 -  int s = starts[0], e = ends[0];
 -
 -  if (!matchedSomething) return findFirstMatch();
 -  if (s == e) ++e;
 -  flags = 0;
 -  clearGroups();
 -
 -  starts[0] = e;
 -  if (e >= (int)str->size()) return 0;
 -  start = e;
 -  lm = e;
 -  ends[0] = pat->head->match(*str, this, e);
 -  return ends[0] >= 0;
 +	int s = starts[0], e = ends[0];
 +
 +	if (!matchedSomething) return findFirstMatch();
 +	if (s == e) ++e;
 +	flags = 0;
 +	clearGroups();
 +
 +	starts[0] = e;
 +	if (e >= (int)str->GetLength()) return 0;
 +	start = e;
 +	lm = e;
 +	ends[0] = pat->head->match(*str, this, e);
 +	return ends[0] >= 0;
  }
 -std::vector<bkstring> WCMatcher::findAll()
 +
 +std::vector<CMString> WCMatcher::findAll()
  {
 -  std::vector<bkstring> ret;
 -  reset();
 -  while (findNextMatch())
 -  {
 -    ret.push_back(getGroup());
 -  }
 -  return ret;
 +	std::vector<CMString> ret;
 +	reset();
 +	while (findNextMatch())
 +	{
 +		ret.push_back(getGroup());
 +	}
 +	return ret;
  }
  void WCMatcher::reset()
  {
 -  lm = 0;
 -  clearGroups();
 -  matchedSomething = false;
 +	lm = 0;
 +	clearGroups();
 +	matchedSomething = false;
  }
  int WCMatcher::getStartingIndex(const int groupNum) const
  {
 -  if (groupNum < 0 || groupNum >= gc) return -1;
 -  return starts[groupNum];
 +	if (groupNum < 0 || groupNum >= gc) return -1;
 +	return starts[groupNum];
  }
 +
  int WCMatcher::getEndingIndex(const int groupNum) const
  {
 -  if (groupNum < 0 || groupNum >= gc) return -1;
 -  return ends[groupNum];
 +	if (groupNum < 0 || groupNum >= gc) return -1;
 +	return ends[groupNum];
  }
 -bkstring WCMatcher::getGroup(const int groupNum) const
 +
 +CMString WCMatcher::getGroup(const int groupNum) const
  {
 -  if (groupNum < 0 || groupNum >= gc) return L"";
 -  if (starts[groupNum] < 0 || ends[groupNum] < 0) return L"";
 -  return str->substr(starts[groupNum], ends[groupNum] - starts[groupNum]);
 +	if (groupNum < 0 || groupNum >= gc) return L"";
 +	if (starts[groupNum] < 0 || ends[groupNum] < 0) return L"";
 +	return str->Mid(starts[groupNum], ends[groupNum] - starts[groupNum]);
  }
 -std::vector<bkstring> WCMatcher::getGroups(const bool includeGroupZero) const
 +
 +std::vector<CMString> WCMatcher::getGroups(const bool includeGroupZero) const
  {
 -  int i, start = (includeGroupZero ? 0 : 1);
 -  std::vector<bkstring> ret;
 -
 -  for (i = start; i < gc; ++i)
 -  {
 -    ret.push_back(getGroup(i));
 -  }
 -  return ret;
 -}
 +	int i, start = (includeGroupZero ? 0 : 1);
 +	std::vector<CMString> ret;
 +
 +	for (i = start; i < gc; ++i)
 +		ret.push_back(getGroup(i));
 +	return ret;
 +}
 diff --git a/plugins/SmileyAdd/src/regexp/WCMatcher.h b/plugins/SmileyAdd/src/regexp/WCMatcher.h index 45610690ba..3c5df018d7 100644 --- a/plugins/SmileyAdd/src/regexp/WCMatcher.h +++ b/plugins/SmileyAdd/src/regexp/WCMatcher.h @@ -23,7 +23,7 @@    invocation looks like:
    <pre>
    wchar_t buf[10000];
 -  bkstring str = "\\5 (user name \\1) uses \\7 for his/her shell and \\6 is their home directory";
 +  CMString str = "\\5 (user name \\1) uses \\7 for his/her shell and \\6 is their home directory";
    FILE * fp = fopen("/etc/passwd", "r");
    WCPattern::registerWCPattern("entry", "[^:]+");
    WCPattern * p = WCPattern::compile("^({entry}):({entry}):({entry}):({entry}):({entry}):({entry}):({entry})$",
 @@ -92,12 +92,12 @@ class WCMatcher        @param pattern  The pattern with which to search
        @param text     The text in which to search
       */
 -    WCMatcher(WCPattern * pattern, const bkstring & text);
 +    WCMatcher(WCPattern * pattern, const CMString & text);
    protected:
      /// The pattern we use to match
      WCPattern * pat;
      /// The string in which we are matching
 -    const bkstring * str;
 +    const CMString * str;
      /// The starting point of our match
      int start;
      /// An array of the starting positions for each group
 @@ -135,7 +135,7 @@ class WCMatcher        @param str The string in which to replace text
        @return A string with all backreferences appropriately replaced
       */
 -    bkstring replaceWithGroups(const bkstring & str);
 +    CMString replaceWithGroups(const CMString & str);
      /**
        The flags currently being used by the matcher.
        @return Zero
 @@ -145,7 +145,7 @@ class WCMatcher        The text being searched by the matcher.
        @return the text being searched by the matcher.
       */
 -    const bkstring& getText() const;
 +    const CMString& getText() const;
      /**
        Scans the string from start to finish for a match. The entire string must
 @@ -179,7 +179,7 @@ class WCMatcher        @return Every substring in order which matches the given pattern
       */
 -    std::vector<bkstring> findAll();
 +    std::vector<CMString> findAll();
      /**
        Resets the internal state of the matcher
       */
 @@ -188,12 +188,12 @@ class WCMatcher        Same as getText. Left n for backwards compatibilty with old source code
        @return Returns the string that is currently being used for matching
       */
 -    inline const bkstring&  getString()                           const { return *str; }
 +    inline const CMString&  getString()                           const { return *str; }
      /**
        Sets the string to scan
        @param newStr The string to scan for subsequent matches
       */
 -    inline void         setString(const bkstring & newStr)       { str = &newStr; reset(); }
 +    inline void         setString(const CMString & newStr)       { str = &newStr; reset(); }
      /**
        Returns the starting index of the specified group.
 @@ -217,14 +217,14 @@ class WCMatcher        @param groupNum The group to query
        @return The text of the group
       */
 -    bkstring getGroup(const int groupNum = 0) const;
 +    CMString getGroup(const int groupNum = 0) const;
      /**
        Returns every capture group in a vector
        @param includeGroupZero Whether or not include capture group zero
        @return Every capture group
       */
 -    std::vector<bkstring> getGroups(const bool includeGroupZero = 0) const;
 +    std::vector<CMString> getGroups(const bool includeGroupZero = 0) const;
  };
  #endif
 diff --git a/plugins/SmileyAdd/src/regexp/WCPattern.cpp b/plugins/SmileyAdd/src/regexp/WCPattern.cpp index e44c835b39..c6d3d500f9 100644 --- a/plugins/SmileyAdd/src/regexp/WCPattern.cpp +++ b/plugins/SmileyAdd/src/regexp/WCPattern.cpp @@ -13,7 +13,7 @@    I tend to delete email if I don't recognize the name and the subject is
    something like "I Need Your Help" or "Got A Second" or "I Found It".
    "
 - */
 +  */
  /*
    Detailed documentation is provided in this class' header file
 @@ -21,1173 +21,1110 @@    @author   Jeffery Stuart
    @since    November 2004
    @version  1.07.00
 -*/
 +  */
  #include "..\general.h"
 -std::map<bkstring, WCPattern *> WCPattern::compiledWCPatterns;
 -std::map<bkstring, std::pair<bkstring, unsigned long> > WCPattern::registeredWCPatterns;
 +std::map<CMString, WCPattern *> WCPattern::compiledWCPatterns;
 +std::map<CMString, std::pair<CMString, unsigned long> > WCPattern::registeredWCPatterns;
  const int WCPattern::MIN_QMATCH = 0x00000000;
  const int WCPattern::MAX_QMATCH = 0x7FFFFFFF;
 -const unsigned long WCPattern::CASE_INSENSITIVE       = 0x01;
 -const unsigned long WCPattern::LITERAL                = 0x02;
 -const unsigned long WCPattern::DOT_MATCHES_ALL        = 0x04;
 -const unsigned long WCPattern::MULTILINE_MATCHING     = 0x08;
 -const unsigned long WCPattern::UNIX_LINE_MODE         = 0x10;
 +const unsigned long WCPattern::CASE_INSENSITIVE = 0x01;
 +const unsigned long WCPattern::LITERAL = 0x02;
 +const unsigned long WCPattern::DOT_MATCHES_ALL = 0x04;
 +const unsigned long WCPattern::MULTILINE_MATCHING = 0x08;
 +const unsigned long WCPattern::UNIX_LINE_MODE = 0x10;
  #define to_lower(a) (wchar_t)(UINT_PTR)CharLowerW((LPWSTR)(unsigned)a)
  #define is_alpha IsCharAlphaW
  #if defined(_WIN32)
 -  #define str_icmp lstrcmpiW
 +#define str_icmp lstrcmpiW
  #elif defined(__CYGWIN__) || defined(__APPLE__)
 -  #include <wctype.h>
 -  static inline int str_icmp(const wchar_t * a, const wchar_t * b)
 -  {
 -    while (*a && *b)
 -    {
 -      const int t = (int)towlower(*a) - (int)tolower(*b);
 -      if (t) return t;
 -      ++a; ++b;
 -    }
 -    if (*a)
 -    {
 -      if (*b) return (int)towlower(*a) - (int)tolower(*b);
 -      return 1;
 -    }
 -    else if (*b) return 1;
 -    return 0;
 -  }
 +#include <wctype.h>
 +static inline int str_icmp(const wchar_t * a, const wchar_t * b)
 +{
 +	while (*a && *b)
 +	{
 +		const int t = (int)towlower(*a) - (int)tolower(*b);
 +		if (t) return t;
 +		++a; ++b;
 +	}
 +	if (*a)
 +	{
 +		if (*b) return (int)towlower(*a) - (int)tolower(*b);
 +		return 1;
 +	}
 +	else if (*b) return 1;
 +	return 0;
 +}
  #else
 -  #define str_icmp wcscasecmp
 +#define str_icmp wcscasecmp
  #endif
 -WCPattern::WCPattern(const bkstring & rhs)
 +WCPattern::WCPattern(const CMString & rhs)
  {
 -  matcher = NULL;
 -  pattern = rhs;
 -  curInd = 0;
 -  groupCount = 0;
 -  nonCapGroupCount = 0;
 -  error = 0;
 -  head = NULL;
 +	matcher = NULL;
 +	pattern = rhs;
 +	curInd = 0;
 +	groupCount = 0;
 +	nonCapGroupCount = 0;
 +	error = 0;
 +	head = NULL;
  }
  // convenience function in case we want to add any extra debugging output
  void WCPattern::raiseError()
  {
 -/*  switch (pattern[curInd - 1])
 -  {
 -  case '*':
 -  case ')':
 -  case '+':
 -  case '?':
 -  case ']':
 -  case '}':
 -    fwprintf(stderr, L"%s\n%*c^\n", pattern.c_str(), curInd - 1, ' ');
 -    fwprintf(stderr, L"Syntax Error near here. Possible unescaped meta character.\n");
 -    break;
 -  default:
 -    fwprintf(stderr, L"%s\n%*c^\n", pattern.c_str(), curInd - 1, ' ');
 -    fwprintf(stderr, L"Syntax Error near here. \n");
 -    break;
 -  }*/
 -  error = 1;
 +	/*  switch (pattern[curInd - 1])
 +	  {
 +	  case '*':
 +	  case ')':
 +	  case '+':
 +	  case '?':
 +	  case ']':
 +	  case '}':
 +	  fwprintf(stderr, L"%s\n%*c^\n", pattern.c_str(), curInd - 1, ' ');
 +	  fwprintf(stderr, L"Syntax Error near here. Possible unescaped meta character.\n");
 +	  break;
 +	  default:
 +	  fwprintf(stderr, L"%s\n%*c^\n", pattern.c_str(), curInd - 1, ' ');
 +	  fwprintf(stderr, L"Syntax Error near here. \n");
 +	  break;
 +	  }*/
 +	error = 1;
  }
  NFAUNode * WCPattern::registerNode(NFAUNode * node)
  {
 -  nodes[node] = 1;
 -  return node;
 +	nodes[node] = 1;
 +	return node;
  }
 -bkstring WCPattern::classUnion      (bkstring s1, bkstring s2)  const
 +CMString WCPattern::classUnion(CMString s1, CMString s2) const
  {
 -  wchar_t * out = new wchar_t[66000];
 -  std::sort(s1.begin(), s1.end());
 -  std::sort(s2.begin(), s2.end());
 -  wchar_t* p = std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), out); *p = 0;
 -  bkstring ret = out;
 -  delete [] out;
 -  return ret;
 +	wchar_t * out = new wchar_t[66000];
 +	std::sort((LPTSTR)s1.GetString(), (LPTSTR)s1.GetTail());
 +	std::sort((LPTSTR)s2.GetString(), (LPTSTR)s2.GetTail());
 +	wchar_t* p = std::set_union(s1.GetString(), s1.GetTail(), s2.GetString(), s2.GetTail(), out); *p = 0;
 +	CMString ret = out;
 +	delete[] out;
 +	return ret;
  }
 -bkstring WCPattern::classIntersect  (bkstring s1, bkstring s2)  const
 +
 +CMString WCPattern::classIntersect(CMString s1, CMString s2) const
  {
 -  wchar_t * out = new wchar_t[66000];
 -  std::sort(s1.begin(), s1.end());
 -  std::sort(s2.begin(), s2.end());
 -  *std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), out) = 0;
 -  bkstring ret = out;
 -  delete [] out;
 -  return ret;
 +	wchar_t * out = new wchar_t[66000];
 +	std::sort((LPTSTR)s1.GetString(), (LPTSTR)s1.GetTail());
 +	std::sort((LPTSTR)s2.GetString(), (LPTSTR)s2.GetTail());
 +	*std::set_intersection(s1.GetString(), s1.GetTail(), s2.GetString(), s2.GetTail(), out) = 0;
 +	CMString ret = out;
 +	delete[] out;
 +	return ret;
  }
 -bkstring WCPattern::classNegate     (bkstring s1)                  const
 +
 +CMString WCPattern::classNegate(CMString s1) const
  {
 -  wchar_t * out = new wchar_t[66000];
 -  int i, ind = 0;
 -  std::map<wchar_t, bool> m;
 +	wchar_t * out = new wchar_t[66000];
 +	int i, ind = 0;
 +	std::map<wchar_t, bool> m;
 -  for (i = 0; i < (int)s1.size(); ++i) m[s1[i]] = 1;
 -  for (i = 0xFF; i >= 0; --i) if (m.find((wchar_t)i) == m.end()) out[ind++] = (wchar_t)i;
 -  out[ind] = 0;
 -  bkstring ret(out, ind);
 -  delete [] out;
 -  return ret;
 +	for (i = 0; i < s1.GetLength(); ++i) m[s1[i]] = 1;
 +	for (i = 0xFF; i >= 0; --i) if (m.find((wchar_t)i) == m.end()) out[ind++] = (wchar_t)i;
 +	out[ind] = 0;
 +	CMString ret(out, ind);
 +	delete[] out;
 +	return ret;
  }
 -bkstring WCPattern::classCreateRange(wchar_t low, wchar_t hi)    const
 +
 +CMString WCPattern::classCreateRange(wchar_t low, wchar_t hi)    const
  {
 -  wchar_t out[300];
 -  int ind = 0;
 -  while (low != hi) out[ind++] = low++;
 -  out[ind++] = low;
 -  return bkstring(out, ind);
 +	wchar_t out[300];
 +	int ind = 0;
 +	while (low != hi) out[ind++] = low++;
 +	out[ind++] = low;
 +	return CMString(out, ind);
  }
  int WCPattern::getInt(int start, int end)
  {
 -  int ret = 0;
 -  for (; start <= end; ++start) ret = ret * 10 + (pattern[start] - (wchar_t)'0');
 -  return ret;
 +	int ret = 0;
 +	for (; start <= end; ++start) ret = ret * 10 + (pattern[start] - '0');
 +	return ret;
  }
 +
  bool WCPattern::quantifyCurly(int & sNum, int & eNum)
  {
 -  bool good = 1;
 -  int i, ci = curInd + 1;
 -  int commaInd = ci, endInd = ci, len = (int)pattern.size();
 -  sNum = eNum = 0;
 -
 -  while (endInd   < len     && pattern[endInd  ] != (wchar_t)'}') ++endInd;
 -  while (commaInd < endInd  && pattern[commaInd] != (wchar_t)',') ++commaInd;
 -  if (endInd >= len) { raiseError(); return 0; }
 -  for (i = ci; good && i < endInd; ++i) if (i != commaInd && !isdigit(pattern[i])) good = 0;
 -  if (!good && commaInd < endInd) { raiseError(); return 0; }
 -  if (!good) return 0;
 -  /* so now everything in here is either a comma (and there is at most one comma) or a digit */
 -  if (commaInd == ci) // {,*}
 -  {
 -    if (endInd == commaInd + 1)    { sNum = MIN_QMATCH;               eNum = MAX_QMATCH;                        } // {,} = *
 -    else                           { sNum = MIN_QMATCH;               eNum = getInt(commaInd + 1, endInd - 1);  } // {,+}
 -  }
 -  else if (commaInd == endInd - 1) { sNum = getInt(ci, commaInd - 1); eNum = MAX_QMATCH;                        } // {+,}
 -  else if (commaInd == endInd)     { sNum = getInt(ci, endInd - 1);   eNum = sNum;                              } // {+}
 -  else                             { sNum = getInt(ci, commaInd - 1); eNum = getInt(commaInd + 1, endInd - 1);  } // {+,+}
 -  curInd = endInd + 1;
 -  return 1;
 +	bool good = 1;
 +	int i, ci = curInd + 1;
 +	int commaInd = ci, endInd = ci, len = pattern.GetLength();
 +	sNum = eNum = 0;
 +
 +	while (endInd < len     && pattern[endInd] != '}') ++endInd;
 +	while (commaInd < endInd  && pattern[commaInd] != ',') ++commaInd;
 +	if (endInd >= len) { raiseError(); return 0; }
 +	for (i = ci; good && i < endInd; ++i) if (i != commaInd && !isdigit(pattern[i])) good = 0;
 +	if (!good && commaInd < endInd) { raiseError(); return 0; }
 +	if (!good) return 0;
 +	/* so now everything in here is either a comma (and there is at most one comma) or a digit */
 +	if (commaInd == ci) // {,*}
 +	{
 +		if (endInd == commaInd + 1)    { sNum = MIN_QMATCH;               eNum = MAX_QMATCH; } // {,} = *
 +		else                           { sNum = MIN_QMATCH;               eNum = getInt(commaInd + 1, endInd - 1); } // {,+}
 +	}
 +	else if (commaInd == endInd - 1) { sNum = getInt(ci, commaInd - 1); eNum = MAX_QMATCH; } // {+,}
 +	else if (commaInd == endInd)     { sNum = getInt(ci, endInd - 1);   eNum = sNum; } // {+}
 +	else                             { sNum = getInt(ci, commaInd - 1); eNum = getInt(commaInd + 1, endInd - 1); } // {+,+}
 +	curInd = endInd + 1;
 +	return 1;
  }
 +
  NFAUNode * WCPattern::quantifyGroup(NFAUNode * start, NFAUNode * stop, const int gn)
  {
 -  NFAUNode * newNode = NULL;
 -  int type = 0;
 -
 -  if (curInd < (int)pattern.size())
 -  {
 -    wchar_t ch = (curInd + 1 >= (int)pattern.size()) ? USHRT_MAX : pattern[curInd + 1];
 -    switch (pattern[curInd])
 -    {
 -    case (wchar_t)'*':
 -      ++curInd;
 -      switch (ch)
 -      {
 -      case (wchar_t)'?': ++curInd; type = 1; break;
 -      case (wchar_t)'+': ++curInd; type = 2; break;
 -      }
 -      newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 -      newNode->next = registerNode(new NFAGroupLoopUNode(start, MIN_QMATCH, MAX_QMATCH, gn, type));
 -      stop->next = newNode->next;
 -      return newNode;
 -    case (wchar_t)'?':
 -      ++curInd;
 -      switch (ch)
 -      {
 -      case (wchar_t)'?': ++curInd; type = 1; break;
 -      case (wchar_t)'+': ++curInd; type = 2; break;
 -      }
 -      newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 -      newNode->next = registerNode(new NFAGroupLoopUNode(start, MIN_QMATCH, 1, gn, type));
 -      stop->next = newNode->next;
 -      return newNode;
 -    case (wchar_t)'+':
 -      ++curInd;
 -      switch (ch)
 -      {
 -      case (wchar_t)'?': ++curInd; type = 1; break;
 -      case (wchar_t)'+': ++curInd; type = 2; break;
 -      }
 -      newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 -      newNode->next = registerNode(new NFAGroupLoopUNode(start, 1, MAX_QMATCH, gn, type));
 -      stop->next = newNode->next;
 -      return newNode;
 -    case (wchar_t)'{':
 -      {
 -        int s, e;
 -        if (quantifyCurly(s, e))
 -        {
 -          ch = (curInd < (int)pattern.size()) ? pattern[curInd] : USHRT_MAX;
 -          switch (ch)
 -          {
 -          case (wchar_t)'?': ++curInd; type = 1; break;
 -          case (wchar_t)'+': ++curInd; type = 2; break;
 -          }
 -          newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 -          newNode->next = registerNode(new NFAGroupLoopUNode(start, s, e, gn, type));
 -          stop->next = newNode->next;
 -          return newNode;
 -        }
 -      }
 -    default:
 -      break;
 -    }
 -  }
 -  return NULL;
 +	NFAUNode * newNode = NULL;
 +	int type = 0;
 +
 +	if (curInd < pattern.GetLength()) {
 +		wchar_t ch = (curInd + 1 >= pattern.GetLength()) ? USHRT_MAX : pattern[curInd + 1];
 +		switch (pattern[curInd]) {
 +		case '*':
 +			++curInd;
 +			switch (ch) {
 +				case '?': ++curInd; type = 1; break;
 +				case '+': ++curInd; type = 2; break;
 +			}
 +			newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 +			newNode->next = registerNode(new NFAGroupLoopUNode(start, MIN_QMATCH, MAX_QMATCH, gn, type));
 +			stop->next = newNode->next;
 +			return newNode;
 +		case '?':
 +			++curInd;
 +			switch (ch) {
 +				case '?': ++curInd; type = 1; break;
 +				case '+': ++curInd; type = 2; break;
 +			}
 +			newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 +			newNode->next = registerNode(new NFAGroupLoopUNode(start, MIN_QMATCH, 1, gn, type));
 +			stop->next = newNode->next;
 +			return newNode;
 +		case '+':
 +			++curInd;
 +			switch (ch) {
 +				case '?': ++curInd; type = 1; break;
 +				case '+': ++curInd; type = 2; break;
 +			}
 +			newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 +			newNode->next = registerNode(new NFAGroupLoopUNode(start, 1, MAX_QMATCH, gn, type));
 +			stop->next = newNode->next;
 +			return newNode;
 +		case '{':
 +			{
 +				int s, e;
 +				if (quantifyCurly(s, e)) {
 +					ch = (curInd < pattern.GetLength()) ? pattern[curInd] : USHRT_MAX;
 +					switch (ch) {
 +						case '?': ++curInd; type = 1; break;
 +						case '+': ++curInd; type = 2; break;
 +					}
 +					newNode = registerNode(new NFAGroupLoopPrologueUNode(gn));
 +					newNode->next = registerNode(new NFAGroupLoopUNode(start, s, e, gn, type));
 +					stop->next = newNode->next;
 +					return newNode;
 +				}
 +			}
 +		}
 +	}
 +	return NULL;
  }
  NFAUNode * WCPattern::quantify(NFAUNode * newNode)
  {
 -  if (curInd < (int)pattern.size())
 -  {
 -    wchar_t ch = (curInd + 1 >= (int)pattern.size()) ? USHRT_MAX : pattern[curInd + 1];
 -    switch (pattern[curInd])
 -    {
 -    case (wchar_t)'*':
 -      ++curInd;
 -      switch (ch)
 -      {
 -      case (wchar_t)'?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode      (this, newNode, MIN_QMATCH, MAX_QMATCH)); break;
 -      case (wchar_t)'+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, MIN_QMATCH, MAX_QMATCH)); break;
 -      default:            newNode = registerNode(new NFAGreedyQuantifierUNode    (this, newNode, MIN_QMATCH, MAX_QMATCH)); break;
 -      }
 -      break;
 -    case (wchar_t)'?':
 -      ++curInd;
 -      switch (ch)
 -      {
 -      case (wchar_t)'?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode      (this, newNode, MIN_QMATCH, 1)); break;
 -      case (wchar_t)'+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, MIN_QMATCH, 1)); break;
 -      default:            newNode = registerNode(new NFAGreedyQuantifierUNode    (this, newNode, MIN_QMATCH, 1)); break;
 -      }
 -      break;
 -    case (wchar_t)'+':
 -      ++curInd;
 -      switch (ch)
 -      {
 -      case (wchar_t)'?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode      (this, newNode, 1, MAX_QMATCH)); break;
 -      case (wchar_t)'+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, 1, MAX_QMATCH)); break;
 -      default:            newNode = registerNode(new NFAGreedyQuantifierUNode    (this, newNode, 1, MAX_QMATCH)); break;
 -      }
 -      break;
 -    case (wchar_t)'{':
 -      {
 -        int s, e;
 -        if (quantifyCurly(s, e))
 -        {
 -          ch = (curInd < (int)pattern.size()) ? pattern[curInd] : USHRT_MAX;
 -          switch (ch)
 -          {
 -          case (wchar_t)'?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode      (this, newNode, s, e)); break;
 -          case (wchar_t)'+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, s, e)); break;
 -          default:            newNode = registerNode(new NFAGreedyQuantifierUNode    (this, newNode, s, e)); break;
 -          }
 -        }
 -      }
 -      break;
 -    default:
 -      break;
 -    }
 -  }
 -  return newNode;
 -}
 -bkstring WCPattern::parseClass()
 -{
 -  bkstring t, ret = L"";
 -  wchar_t ch, c1, c2;
 -  bool inv = 0, neg = 0, quo = 0;
 -
 -  if (curInd < (int)pattern.size() && pattern[curInd] == (wchar_t)'^')
 -  {
 -    ++curInd;
 -    neg = 1;
 -  }
 -  while (curInd < (int)pattern.size() && pattern[curInd] != (wchar_t)']')
 -  {
 -    ch = pattern[curInd++];
 -    if (ch == (wchar_t)'[')
 -    {
 -      t = parseClass();
 -      ret = classUnion(ret, t);
 -    }
 -    /*else if (ch == (wchar_t)'-')
 -    {
 -      raiseError();
 -      curInd = pattern.size();
 -    }*/
 -    else if (ch == (wchar_t)'&' && curInd < (int)pattern.size() && pattern[curInd] == (wchar_t)'&')
 -    {
 -      if (pattern[++curInd] != (wchar_t)'[')
 -      {
 -        raiseError();
 -        curInd = (int)pattern.size();
 -      }
 -      else
 -      {
 -        ++curInd;
 -        t = parseClass();
 -        ret = classIntersect(ret, t);
 -      }
 -    }
 -    else if (ch == (wchar_t)'\\')
 -    {
 -      t = parseEscape(inv, quo);
 -      if (quo)
 -      {
 -        raiseError();
 -        curInd = (int)pattern.size();
 -      }
 -      else if (inv || t.size() > 1) // cant be part of a range (a-z)
 -      {
 -        if (inv) t = classNegate(t);
 -        ret = classUnion(ret, t);
 -      }
 -      else if (curInd < (int)pattern.size() && pattern[curInd] == (wchar_t)'-') // part of a range (a-z)
 -      {
 -        c1 = t[0];
 -        ++curInd;
 -        if (curInd >= (int)pattern.size()) raiseError();
 -        else
 -        {
 -          c2 = pattern[curInd++];
 -          if (c2 == (wchar_t)'\\')
 -          {
 -            t = parseEscape(inv, quo);
 -            if (quo)
 -            {
 -              raiseError();
 -              curInd = (int)pattern.size();
 -            }
 -            else if (inv || t.size() > 1) raiseError();
 -            else ret = classUnion(ret, classCreateRange(c1, c2));
 -          }
 -          else if (c2 == (wchar_t)'[' || c2 == (wchar_t)']' || c2 == (wchar_t)'-' || c2 == (wchar_t)'&')
 -          {
 -            raiseError();
 -            curInd = (int)pattern.size();
 -          }
 -          else ret = classUnion(ret, classCreateRange(c1, c2));
 -        }
 -      }
 -      else
 -      {
 -        ret = classUnion(ret, t);
 -      }
 -    }
 -    else if (curInd < (int)pattern.size() && pattern[curInd] == (wchar_t)'-')
 -    {
 -      c1 = ch;
 -      ++curInd;
 -      if (curInd >= (int)pattern.size()) raiseError();
 -      else
 -      {
 -        c2 = pattern[curInd++];
 -        if (c2 == (wchar_t)'\\')
 -        {
 -          t = parseEscape(inv, quo);
 -          if (quo)
 -          {
 -            raiseError();
 -            curInd = (int)pattern.size();
 -          }
 -          else if (inv || t.size() > 1) raiseError();
 -          else ret = classUnion(ret, classCreateRange(c1, c2));
 -        }
 -        else if (c2 == (wchar_t)'[' || c2 == (wchar_t)']' || c2 == (wchar_t)'-' || c2 == (wchar_t)'&')
 -        {
 -          raiseError();
 -          curInd = (int)pattern.size();
 -        }
 -        else
 -        {
 -          ret = classUnion(ret, classCreateRange(c1, c2));
 -        }
 -      }
 -    }
 -    else
 -    {
 -      ret += L" ";
 -      ret[ret.size() - 1] = ch;
 -    }
 -  }
 -  if (curInd >= (int)pattern.size() || pattern[curInd] != (wchar_t)']')
 -  {
 -    raiseError();
 -    ret = L"";
 -  }
 -  else
 -  {
 -    ++curInd;
 -    if (neg) ret = classNegate(ret);
 -  }
 -  return ret;
 -}
 -bkstring WCPattern::parsePosix()
 -{
 -  bkstring s7 = pattern.substr(curInd, 7);
 -  if (s7 == L"{Lower}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyz";                                                                       }
 -  if (s7 == L"{Upper}") { curInd += 7; return L"ABCDEFGHIJKLMNOPQRSTUVWXYZ";                                                                       }
 -  if (s7 == L"{Alpha}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";                                             }
 -  if (s7 == L"{Digit}") { curInd += 7; return L"0123456789";                                                                                       }
 -  if (s7 == L"{Alnum}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";                                   }
 -  if (s7 == L"{Punct}") { curInd += 7; return L"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";                                                               }
 -  if (s7 == L"{Graph}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; }
 -  if (s7 == L"{Print}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; }
 -  if (s7 == L"{Blank}") { curInd += 7; return L" \t";                                                                                              }
 -  if (s7 == L"{Space}") { curInd += 7; return L" \t\n\x0B\f\r";                                                                                    }
 -  if (s7 == L"{Cntrl}")
 -  {
 -	bkstring::value_type i;
 -    bkstring s = L" ";
 -
 -    for (i = 0; i < 5; ++i) s += s;
 -    s += L" ";
 -    for (i = 0; i <= 0x1F; ++i) s[i] = i;
 -    s[0x20] = 0x7F;
 -    curInd += 7;
 -    return s;
 -  }
 -  if (s7 == L"{ASCII}")
 -  {
 -    bkstring s(0x80, (wchar_t)' ');
 -    for (bkstring::value_type i = 0; i <= 0x7f; ++i) s[i] = i;
 -    curInd += 7;
 -    return s;
 -  }
 -  if (pattern.substr(curInd, 8) == L"{XDigit}") { curInd += 8; return L"abcdefABCDEF0123456789"; }
 -  raiseError();
 -  return L"";
 +	if (curInd < pattern.GetLength()) {
 +		wchar_t ch = (curInd + 1 >= pattern.GetLength()) ? USHRT_MAX : pattern[curInd + 1];
 +		switch (pattern[curInd]) {
 +		case '*':
 +			++curInd;
 +			switch (ch) {
 +				case '?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode(this, newNode, MIN_QMATCH, MAX_QMATCH)); break;
 +				case '+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, MIN_QMATCH, MAX_QMATCH)); break;
 +				default:            newNode = registerNode(new NFAGreedyQuantifierUNode(this, newNode, MIN_QMATCH, MAX_QMATCH)); break;
 +			}
 +			break;
 +		case '?':
 +			++curInd;
 +			switch (ch) {
 +				case '?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode(this, newNode, MIN_QMATCH, 1)); break;
 +				case '+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, MIN_QMATCH, 1)); break;
 +				default:            newNode = registerNode(new NFAGreedyQuantifierUNode(this, newNode, MIN_QMATCH, 1)); break;
 +			}
 +			break;
 +		case '+':
 +			++curInd;
 +			switch (ch) {
 +				case '?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode(this, newNode, 1, MAX_QMATCH)); break;
 +				case '+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, 1, MAX_QMATCH)); break;
 +				default:            newNode = registerNode(new NFAGreedyQuantifierUNode(this, newNode, 1, MAX_QMATCH)); break;
 +			}
 +			break;
 +		case '{':
 +			int s, e;
 +			if (quantifyCurly(s, e)) {
 +				ch = (curInd < pattern.GetLength()) ? pattern[curInd] : USHRT_MAX;
 +				switch (ch) {
 +					case '?': ++curInd; newNode = registerNode(new NFALazyQuantifierUNode(this, newNode, s, e)); break;
 +					case '+': ++curInd; newNode = registerNode(new NFAPossessiveQuantifierUNode(this, newNode, s, e)); break;
 +					default:            newNode = registerNode(new NFAGreedyQuantifierUNode(this, newNode, s, e)); break;
 +				}
 +			}
 +			break;
 +		}
 +	}
 +	return newNode;
 +}
 +CMString WCPattern::parseClass()
 +{
 +	CMString t, ret = L"";
 +	wchar_t ch, c1, c2;
 +	bool inv = 0, neg = 0, quo = 0;
 +
 +	if (curInd < pattern.GetLength() && pattern[curInd] == '^')
 +	{
 +		++curInd;
 +		neg = 1;
 +	}
 +	while (curInd < pattern.GetLength() && pattern[curInd] != ']')
 +	{
 +		ch = pattern[curInd++];
 +		if (ch == '[')
 +		{
 +			t = parseClass();
 +			ret = classUnion(ret, t);
 +		}
 +		/*else if (ch == '-')
 +		{
 +		raiseError();
 +		curInd = pattern.GetLength();
 +		}*/
 +		else if (ch == '&' && curInd < pattern.GetLength() && pattern[curInd] == '&') {
 +			if (pattern[++curInd] != '[') {
 +				raiseError();
 +				curInd = pattern.GetLength();
 +			}
 +			else {
 +				++curInd;
 +				t = parseClass();
 +				ret = classIntersect(ret, t);
 +			}
 +		}
 +		else if (ch == '\\')
 +		{
 +			t = parseEscape(inv, quo);
 +			if (quo) {
 +				raiseError();
 +				curInd = pattern.GetLength();
 +			}
 +			else if (inv || t.GetLength() > 1) { // cant be part of a range (a-z)
 +				if (inv) t = classNegate(t);
 +				ret = classUnion(ret, t);
 +			}
 +			else if (curInd < pattern.GetLength() && pattern[curInd] == '-') { // part of a range (a-z) 
 +				c1 = t[0];
 +				++curInd;
 +				if (curInd >= pattern.GetLength()) raiseError();
 +				else {
 +					c2 = pattern[curInd++];
 +					if (c2 == '\\')
 +					{
 +						t = parseEscape(inv, quo);
 +						if (quo)
 +						{
 +							raiseError();
 +							curInd = pattern.GetLength();
 +						}
 +						else if (inv || t.GetLength() > 1) raiseError();
 +						else ret = classUnion(ret, classCreateRange(c1, c2));
 +					}
 +					else if (c2 == '[' || c2 == ']' || c2 == '-' || c2 == '&')
 +					{
 +						raiseError();
 +						curInd = pattern.GetLength();
 +					}
 +					else ret = classUnion(ret, classCreateRange(c1, c2));
 +				}
 +			}
 +			else
 +			{
 +				ret = classUnion(ret, t);
 +			}
 +		}
 +		else if (curInd < pattern.GetLength() && pattern[curInd] == '-')
 +		{
 +			c1 = ch;
 +			++curInd;
 +			if (curInd >= pattern.GetLength()) raiseError();
 +			else
 +			{
 +				c2 = pattern[curInd++];
 +				if (c2 == '\\')
 +				{
 +					t = parseEscape(inv, quo);
 +					if (quo)
 +					{
 +						raiseError();
 +						curInd = pattern.GetLength();
 +					}
 +					else if (inv || t.GetLength() > 1) raiseError();
 +					else ret = classUnion(ret, classCreateRange(c1, c2));
 +				}
 +				else if (c2 == '[' || c2 == ']' || c2 == '-' || c2 == '&')
 +				{
 +					raiseError();
 +					curInd = pattern.GetLength();
 +				}
 +				else
 +				{
 +					ret = classUnion(ret, classCreateRange(c1, c2));
 +				}
 +			}
 +		}
 +		else ret.AppendChar(ch);
 +	}
 +	if (curInd >= pattern.GetLength() || pattern[curInd] != ']')
 +	{
 +		raiseError();
 +		ret = L"";
 +	}
 +	else
 +	{
 +		++curInd;
 +		if (neg) ret = classNegate(ret);
 +	}
 +	return ret;
 +}
 +CMString WCPattern::parsePosix()
 +{
 +	CMString s7 = pattern.Mid(curInd, 7);
 +	if (s7 == L"{Lower}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyz"; }
 +	if (s7 == L"{Upper}") { curInd += 7; return L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"; }
 +	if (s7 == L"{Alpha}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; }
 +	if (s7 == L"{Digit}") { curInd += 7; return L"0123456789"; }
 +	if (s7 == L"{Alnum}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; }
 +	if (s7 == L"{Punct}") { curInd += 7; return L"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; }
 +	if (s7 == L"{Graph}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; }
 +	if (s7 == L"{Print}") { curInd += 7; return L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; }
 +	if (s7 == L"{Blank}") { curInd += 7; return L" \t"; }
 +	if (s7 == L"{Space}") { curInd += 7; return L" \t\n\x0B\f\r"; }
 +	if (s7 == L"{Cntrl}")
 +	{
 +		TCHAR i;
 +		CMString s = L" ";
 +
 +		for (i = 0; i < 5; ++i) s += s;
 +		s += L" ";
 +		for (i = 0; i <= 0x1F; ++i)
 +			s.SetAt(i, i);
 +		s.SetAt(0x20, 0x7F);
 +		curInd += 7;
 +		return s;
 +	}
 +	if (s7 == L"{ASCII}")
 +	{
 +		CMString s(' ', 0x80);
 +		for (int i = 0; i <= 0x7f; ++i) s.SetAt(i, i);
 +		curInd += 7;
 +		return s;
 +	}
 +	if (pattern.Mid(curInd, 8) == L"{XDigit}") { curInd += 8; return L"abcdefABCDEF0123456789"; }
 +	raiseError();
 +	return L"";
  }
  NFAUNode * WCPattern::parseBackref()
  {
 -  #define is_dig(x) ((x) >= (wchar_t)'0' && (x) <= (wchar_t)'9')
 -  #define to_int(x) ((x) - (wchar_t)'0')
 -  int ci = curInd;
 -  int oldRef = 0, ref = 0;
 -
 -  while (ci < (int)pattern.size() && is_dig(pattern[ci]) && (ref < 10 || ref < groupCount))
 -  {
 -    oldRef = ref;
 -    ref = ref * 10 + to_int(pattern[ci++]);
 -  }
 -  if (ci == (int)pattern.size())
 -  {
 -    oldRef = ref;
 -    ++ci;
 -  }
 -  if (oldRef < 0 || ci <= curInd)
 -  {
 -    raiseError();
 -    return registerNode(new NFAReferenceUNode(-1));
 -  }
 -  curInd = ci;
 -  return registerNode(new NFAReferenceUNode(ref));
 -
 -  #undef is_dig
 -  #undef to_int
 -}
 -bkstring WCPattern::parseOctal()
 -{
 -  #define islowoc(x)  ((x) >= (wchar_t)'0' && (x) <= (wchar_t)'3')
 -  #define isoc(x)     ((x) >= (wchar_t)'0' && (x) <= (wchar_t)'7')
 -  #define fromoc(x)   ((x) - (wchar_t)'0')
 -  int ci = curInd;
 -  wchar_t ch1 = (ci + 0 < (int)pattern.size()) ? pattern[ci + 0] : USHRT_MAX;
 -  wchar_t ch2 = (ci + 1 < (int)pattern.size()) ? pattern[ci + 1] : USHRT_MAX;
 -  wchar_t ch3 = (ci + 2 < (int)pattern.size()) ? pattern[ci + 2] : USHRT_MAX;
 -  bkstring s = L" ";
 -
 -  if (islowoc(ch1) && isoc(ch2))
 -  {
 -    curInd += 2;
 -    s[0] = fromoc(ch1) * 8 + fromoc(ch2);
 -    if (isoc(ch3))
 -    {
 -      ++curInd;
 -      s[0] = s[0] * 8 + fromoc(ch3);
 -    }
 -  }
 -  else if (isoc(ch1) && isoc(ch2))
 -  {
 -    curInd += 2;
 -    s[0] = fromoc(ch1) * 8 + fromoc(ch2);
 -  }
 -  else raiseError();
 -
 -  return s;
 -  #undef islowoc
 -  #undef isoc
 -  #undef fromoc
 -}
 -bkstring WCPattern::parseHex()
 -{
 -  #define to_low(x)   (((x) >= (wchar_t)'A' && (x) <= (wchar_t)'Z') ? ((x) - (wchar_t)'A' + (wchar_t)'a') : (x))
 -  #define is_dig(x)   ((x) >= (wchar_t)'0' && (x) <= (wchar_t)'9')
 -  #define is_hex(x)   (is_dig(x) || (to_low(x) >= (wchar_t)'a' && to_low(x) <= (wchar_t)'f'))
 -  #define to_int(x)   ((is_dig(x)) ? ((x) - (wchar_t)'0') : (to_low(x) - (wchar_t)'a' + 10))
 -
 -  int ci = curInd;
 -  wchar_t ch1 = (ci + 0 < (int)pattern.size()) ? pattern[ci + 0] : USHRT_MAX;
 -  wchar_t ch2 = (ci + 1 < (int)pattern.size()) ? pattern[ci + 1] : USHRT_MAX;
 -  wchar_t ch3 = (ci + 2 < (int)pattern.size()) ? pattern[ci + 2] : USHRT_MAX;
 -  wchar_t ch4 = (ci + 3 < (int)pattern.size()) ? pattern[ci + 3] : USHRT_MAX;
 -  bkstring s = L" ";
 -
 -  if (is_hex(ch1) && is_hex(ch2) && is_hex(ch3) && is_hex(ch4))
 -  {
 -    curInd += 2;
 -    s[0] = (to_int(ch1) << 12 & 0xF000) | (to_int(ch2) << 8 & 0x0F00) |
 -           (to_int(ch3) <<  4 & 0x0F00) | (to_int(ch4)      & 0x000F);
 -  }
 -  else if (is_hex(ch1) && is_hex(ch2))
 -  {
 -    curInd += 2;
 -    s[0] = (to_int(ch1) << 4 & 0xF0) | (to_int(ch2) & 0x0F);
 -  }
 -
 -  return s;
 -  #undef to_low
 -  #undef is_dig
 -  #undef is_hex
 -  #undef to_int
 -}
 -bkstring WCPattern::parseEscape(bool & inv, bool & quo)
 -{
 -  wchar_t ch = pattern[curInd++];
 -  bkstring classes = L"";
 -
 -  if (curInd > (int)pattern.size())
 -  {
 -    raiseError();
 -    return NULL;
 -  }
 -
 -  quo = 0;
 -  inv = 0;
 -  switch (ch)
 -  {
 -  case (wchar_t)'p': classes = parsePosix();                                                         break;
 -  case (wchar_t)'P': classes = L"!!"; classes += parsePosix();                                        break;
 -  case (wchar_t)'d': classes = L"0123456789";                                                         break;
 -  case (wchar_t)'D': classes = L"!!0123456789";                                                       break;
 -  case (wchar_t)'s': classes = L" \t\r\n\f";                                                          break;
 -  case (wchar_t)'S': classes = L"!! \t\r\n\f";                                                        break;
 -  case (wchar_t)'w': classes = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";    break;
 -  case (wchar_t)'W': classes = L"!!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";  break;
 -  case (wchar_t)'0': classes = parseOctal(); break;
 -  case (wchar_t)'x': classes = parseHex();   break;
 -
 -  case (wchar_t)'Q': quo = 1;        break;
 -  case (wchar_t)'t': classes = L"\t"; break;
 -  case (wchar_t)'r': classes = L"\r"; break;
 -  case (wchar_t)'n': classes = L"\n"; break;
 -  case (wchar_t)'f': classes = L"\f"; break;
 -  case (wchar_t)'a': classes = L"\a"; break;
 -  case (wchar_t)'e': classes = L"\r"; break;
 -  default:  classes = L" "; classes[0] = ch; break;
 -  }
 -  if (classes.substr(0, 2) == L"!!")
 -  {
 -    classes = classes.substr(2);
 -    inv = 1;
 -  }
 -  return classes;
 -}
 -NFAUNode * WCPattern::parseRegisteredWCPattern(NFAUNode ** end)
 -{
 -  int i, j;
 -  bkstring s;
 -  NFAUNode * ret = NULL;
 -  for (i = curInd; i < (int)pattern.size() && pattern[i] != (wchar_t)'}'; ++i) { }
 -  if (pattern[i] != (wchar_t)'}') { raiseError(); return NULL; }
 -  if (i == curInd + 1)   { raiseError(); return NULL; } // {}
 -  if (
 -      !(
 -        (pattern[curInd] >= (wchar_t)'a' && pattern[curInd] <= (wchar_t)'z') ||
 -        (pattern[curInd] >= (wchar_t)'A' && pattern[curInd] <= (wchar_t)'Z') ||
 -        (pattern[curInd] == (wchar_t)'_')
 -       )
 -     )
 -  {
 -    raiseError();
 -    return NULL;
 -  }
 -  for (j = curInd; !error && j < i; ++j)
 -  {
 -    if (
 -        !(
 -          (pattern[j] >= (wchar_t)'a' && pattern[j] <= (wchar_t)'z') ||
 -          (pattern[j] >= (wchar_t)'A' && pattern[j] <= (wchar_t)'Z') ||
 -          (pattern[j] >= (wchar_t)'0' && pattern[j] <= (wchar_t)'9') ||
 -          (pattern[j] == (wchar_t)'_')))
 -    {
 -      raiseError();
 -      return NULL;
 -    }
 -  }
 -  s = pattern.substr(curInd, i - curInd);
 -  if (registeredWCPatterns.find(s) == registeredWCPatterns.end()) raiseError();
 -  else
 -  {
 -    unsigned long oflags = flags;
 -    bkstring op = pattern;
 -    int ci = i + 1;
 -
 -    pattern = registeredWCPatterns[s].first;
 -    curInd = 0;
 -    flags = registeredWCPatterns[s].second;
 -
 -    --groupCount;
 -    ret = parse(0, 0, end);
 -
 -    pattern = op;
 -    curInd = ci;
 -    flags = oflags;
 -  }
 -  if (error) { *end = ret = NULL; }
 -  return ret;
 +#define is_dig(x) ((x) >= '0' && (x) <= '9')
 +#define to_int(x) ((x) - '0')
 +	int ci = curInd;
 +	int oldRef = 0, ref = 0;
 +
 +	while (ci < pattern.GetLength() && is_dig(pattern[ci]) && (ref < 10 || ref < groupCount))
 +	{
 +		oldRef = ref;
 +		ref = ref * 10 + to_int(pattern[ci++]);
 +	}
 +	if (ci == pattern.GetLength())
 +	{
 +		oldRef = ref;
 +		++ci;
 +	}
 +	if (oldRef < 0 || ci <= curInd)
 +	{
 +		raiseError();
 +		return registerNode(new NFAReferenceUNode(-1));
 +	}
 +	curInd = ci;
 +	return registerNode(new NFAReferenceUNode(ref));
 +
 +#undef is_dig
 +#undef to_int
 +}
 +CMString WCPattern::parseOctal()
 +{
 +#define islowoc(x)  ((x) >= '0' && (x) <= '3')
 +#define isoc(x)     ((x) >= '0' && (x) <= '7')
 +#define fromoc(x)   ((x) - '0')
 +	int ci = curInd;
 +	wchar_t ch1 = (ci + 0 < pattern.GetLength()) ? pattern[ci + 0] : USHRT_MAX;
 +	wchar_t ch2 = (ci + 1 < pattern.GetLength()) ? pattern[ci + 1] : USHRT_MAX;
 +	wchar_t ch3 = (ci + 2 < pattern.GetLength()) ? pattern[ci + 2] : USHRT_MAX;
 +	CMString s = L" ";
 +
 +	if (islowoc(ch1) && isoc(ch2)) {
 +		curInd += 2;
 +		s.SetAt(0, fromoc(ch1) * 8 + fromoc(ch2));
 +		if (isoc(ch3)) {
 +			++curInd;
 +			s.SetAt(0, s[0] * 8 + fromoc(ch3));
 +		}
 +	}
 +	else if (isoc(ch1) && isoc(ch2)) {
 +		curInd += 2;
 +		s.SetAt(0, fromoc(ch1) * 8 + fromoc(ch2));
 +	}
 +	else raiseError();
 +
 +	return s;
 +#undef islowoc
 +#undef isoc
 +#undef fromoc
 +}
 +CMString WCPattern::parseHex()
 +{
 +#define to_low(x)   (((x) >= 'A' && (x) <= 'Z') ? ((x) - 'A' + 'a') : (x))
 +#define is_dig(x)   ((x) >= '0' && (x) <= '9')
 +#define is_hex(x)   (is_dig(x) || (to_low(x) >= 'a' && to_low(x) <= 'f'))
 +#define to_int(x)   ((is_dig(x)) ? ((x) - '0') : (to_low(x) - 'a' + 10))
 +
 +	int ci = curInd;
 +	wchar_t ch1 = (ci + 0 < pattern.GetLength()) ? pattern[ci + 0] : USHRT_MAX;
 +	wchar_t ch2 = (ci + 1 < pattern.GetLength()) ? pattern[ci + 1] : USHRT_MAX;
 +	wchar_t ch3 = (ci + 2 < pattern.GetLength()) ? pattern[ci + 2] : USHRT_MAX;
 +	wchar_t ch4 = (ci + 3 < pattern.GetLength()) ? pattern[ci + 3] : USHRT_MAX;
 +	CMString s = L" ";
 +
 +	if (is_hex(ch1) && is_hex(ch2) && is_hex(ch3) && is_hex(ch4))
 +	{
 +		curInd += 2;
 +		s.SetAt(0, (to_int(ch1) << 12 & 0xF000) | (to_int(ch2) << 8 & 0x0F00) |
 +			(to_int(ch3) << 4 & 0x0F00) | (to_int(ch4) & 0x000F));
 +	}
 +	else if (is_hex(ch1) && is_hex(ch2))
 +	{
 +		curInd += 2;
 +		s.SetAt(0, (to_int(ch1) << 4 & 0xF0) | (to_int(ch2) & 0x0F));
 +	}
 +
 +	return s;
 +#undef to_low
 +#undef is_dig
 +#undef is_hex
 +#undef to_int
 +}
 +CMString WCPattern::parseEscape(bool & inv, bool & quo)
 +{
 +	wchar_t ch = pattern[curInd++];
 +	CMString classes;
 +
 +	if (curInd > pattern.GetLength()) {
 +		raiseError();
 +		return "";
 +	}
 +
 +	quo = 0;
 +	inv = 0;
 +	switch (ch) {
 +		case 'p': classes = parsePosix();                                                         break;
 +		case 'P': classes = L"!!"; classes += parsePosix();                                        break;
 +		case 'd': classes = L"0123456789";                                                         break;
 +		case 'D': classes = L"!!0123456789";                                                       break;
 +		case 's': classes = L" \t\r\n\f";                                                          break;
 +		case 'S': classes = L"!! \t\r\n\f";                                                        break;
 +		case 'w': classes = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";    break;
 +		case 'W': classes = L"!!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";  break;
 +		case '0': classes = parseOctal(); break;
 +		case 'x': classes = parseHex();   break;
 +		  
 +		case 'Q': quo = 1;        break;
 +		case 't': classes = L"\t"; break;
 +		case 'r': classes = L"\r"; break;
 +		case 'n': classes = L"\n"; break;
 +		case 'f': classes = L"\f"; break;
 +		case 'a': classes = L"\a"; break;
 +		case 'e': classes = L"\r"; break;
 +		default:  classes.AppendChar(ch); break;
 +	}
 +
 +	if (classes.Mid(0, 2) == L"!!") {
 +		classes = classes.Mid(2);
 +		inv = 1;
 +	}
 +	return classes;
 +}
 +NFAUNode * WCPattern::parseRegisteredWCPattern(NFAUNode **end)
 +{
 +	int i, j;
 +	CMString s;
 +	NFAUNode * ret = NULL;
 +	for (i = curInd; i < pattern.GetLength() && pattern[i] != '}'; ++i) {}
 +	if (pattern[i] != '}') { raiseError(); return NULL; }
 +	if (i == curInd + 1)   { raiseError(); return NULL; } // {}
 +	if (
 +		!(
 +		(pattern[curInd] >= 'a' && pattern[curInd] <= 'z') ||
 +		(pattern[curInd] >= 'A' && pattern[curInd] <= 'Z') ||
 +		(pattern[curInd] == '_')
 +		)
 +		)
 +	{
 +		raiseError();
 +		return NULL;
 +	}
 +	for (j = curInd; !error && j < i; ++j)
 +	{
 +		if (
 +			!(
 +			(pattern[j] >= 'a' && pattern[j] <= 'z') ||
 +			(pattern[j] >= 'A' && pattern[j] <= 'Z') ||
 +			(pattern[j] >= '0' && pattern[j] <= '9') ||
 +			(pattern[j] == '_')))
 +		{
 +			raiseError();
 +			return NULL;
 +		}
 +	}
 +	s = pattern.Mid(curInd, i - curInd);
 +	if (registeredWCPatterns.find(s) == registeredWCPatterns.end()) raiseError();
 +	else
 +	{
 +		unsigned long oflags = flags;
 +		CMString op = pattern;
 +		int ci = i + 1;
 +
 +		pattern = registeredWCPatterns[s].first;
 +		curInd = 0;
 +		flags = registeredWCPatterns[s].second;
 +
 +		--groupCount;
 +		ret = parse(0, 0, end);
 +
 +		pattern = op;
 +		curInd = ci;
 +		flags = oflags;
 +	}
 +	if (error) { *end = ret = NULL; }
 +	return ret;
  }
  // look behind should interpret everything as a literal (except \\) since the
  // pattern must have a concrete length
  NFAUNode * WCPattern::parseBehind(const bool pos, NFAUNode ** end)
  {
 -  bkstring t = L"";
 -  while (curInd < (int)pattern.size() && pattern[curInd] != (wchar_t)')')
 -  {
 -    wchar_t ch = pattern[curInd++];
 -    t += L" ";
 -    if (ch == (wchar_t)'\\')
 -    {
 -      if (curInd + 1 >= (int)pattern.size())
 -      {
 -        raiseError();
 -        return *end = registerNode(new NFACharUNode((wchar_t)' '));
 -      }
 -      ch = pattern[curInd++];
 -    }
 -    t[t.size() - 1] = ch;
 -  }
 -  if (curInd >= (int)pattern.size() || pattern[curInd] != (wchar_t)')') raiseError();
 -  else ++curInd;
 -  return *end = registerNode(new NFALookBehindUNode(t, pos));
 +	CMString t = L"";
 +	while (curInd < pattern.GetLength() && pattern[curInd] != ')')
 +	{
 +		wchar_t ch = pattern[curInd++];
 +		if (ch == '\\')
 +		{
 +			if (curInd + 1 >= pattern.GetLength())
 +			{
 +				raiseError();
 +				return *end = registerNode(new NFACharUNode(' '));
 +			}
 +			ch = pattern[curInd++];
 +		}
 +		t.AppendChar(ch);
 +	}
 +	if (curInd >= pattern.GetLength() || pattern[curInd] != ')') raiseError();
 +	else ++curInd;
 +	return *end = registerNode(new NFALookBehindUNode(t, pos));
  }
  NFAUNode * WCPattern::parseQuote()
  {
 -  bool done = 0;
 -  bkstring s = L"";
 -
 -  while (!done)
 -  {
 -    if      (curInd >= (int)pattern.size())
 -    {
 -      raiseError();
 -      done = 1;
 -    }
 -    else if (pattern.substr(curInd, 2) == L"\\E")
 -    {
 -      curInd += 2;
 -      done = 1;
 -    }
 -    else if (pattern[curInd] == (wchar_t)'\\')
 -    {
 -      s += L" ";
 -      s[s.size() - 1] = pattern[++curInd];
 -      ++curInd;
 -    }
 -    else
 -    {
 -      s += L" ";
 -      s[s.size() - 1] = pattern[curInd++];
 -    }
 -  }
 -  if ((flags & WCPattern::CASE_INSENSITIVE) != 0) return registerNode(new NFACIQuoteUNode(s));
 -  return registerNode(new NFAQuoteUNode(s));
 +	bool done = 0;
 +	CMString s = L"";
 +
 +	while (!done)
 +	{
 +		if (curInd >= pattern.GetLength())
 +		{
 +			raiseError();
 +			done = 1;
 +		}
 +		else if (pattern.Mid(curInd, 2) == L"\\E")
 +		{
 +			curInd += 2;
 +			done = 1;
 +		}
 +		else if (pattern[curInd] == '\\')
 +		{
 +			s.AppendChar(pattern[++curInd]);
 +			++curInd;
 +		}
 +		else s.AppendChar(pattern[curInd++]);
 +	}
 +	if ((flags & WCPattern::CASE_INSENSITIVE) != 0) return registerNode(new NFACIQuoteUNode(s));
 +	return registerNode(new NFAQuoteUNode(s));
  }
  NFAUNode * WCPattern::parse(const bool inParen, const bool inOr, NFAUNode ** end)
  {
 -  NFAUNode * start, * cur, * next = NULL;
 -  bkstring t;
 -  int grc = groupCount++;
 -  bool inv, quo;
 -  bool ahead = 0, pos = 0, noncap = 0, indep = 0;
 -  unsigned long oldFlags = flags;
 -
 -  if (inParen)
 -  {
 -    if (pattern[curInd] == (wchar_t)'?')
 -    {
 -      ++curInd;
 -      --groupCount;
 -      if      (pattern[curInd]           == (wchar_t)':')   { noncap = 1; ++curInd;     grc = --nonCapGroupCount; }
 -      else if (pattern[curInd]           == (wchar_t)'=')   { ++curInd;     ahead = 1;  pos = 1;                  }
 -      else if (pattern[curInd]           == (wchar_t)'!')   { ++curInd;     ahead = 1;  pos = 0;                  }
 -      else if (pattern.substr(curInd, 2) == L"<=")  { curInd += 2;  return parseBehind(1, end);                   }
 -      else if (pattern.substr(curInd, 2) == L"<!")  { curInd += 2;  return parseBehind(0, end);                   }
 -      else if (pattern[curInd]           == (wchar_t)'>')   { ++curInd;     indep = 1;                            }
 -      else
 -      {
 -        bool negate = false, done = false;
 -        while (!done)
 -        {
 -          if (curInd >= (int)pattern.size())
 -          {
 -            raiseError();
 -            return NULL;
 -          }
 -          else if (negate)
 -          {
 -            switch (pattern[curInd])
 -            {
 -            case (wchar_t)'i': flags &= ~WCPattern::CASE_INSENSITIVE;   break;
 -            case (wchar_t)'d': flags &= ~WCPattern::UNIX_LINE_MODE;     break;
 -            case (wchar_t)'m': flags &= ~WCPattern::MULTILINE_MATCHING; break;
 -            case (wchar_t)'s': flags &= ~WCPattern::DOT_MATCHES_ALL;    break;
 -            case (wchar_t)':': done = true;                             break;
 -            case (wchar_t)')':
 -              ++curInd;
 -              *end = registerNode(new NFALookBehindUNode(L"", true));
 -              return *end;
 -            case (wchar_t)'-':
 -            default: raiseError(); return NULL;
 -            }
 -          }
 -          else
 -          {
 -            switch (pattern[curInd])
 -            {
 -            case (wchar_t)'i': flags |= WCPattern::CASE_INSENSITIVE;    break;
 -            case (wchar_t)'d': flags |= WCPattern::UNIX_LINE_MODE;      break;
 -            case (wchar_t)'m': flags |= WCPattern::MULTILINE_MATCHING;  break;
 -            case (wchar_t)'s': flags |= WCPattern::DOT_MATCHES_ALL;     break;
 -            case (wchar_t)':': done = true;                             break;
 -            case (wchar_t)'-': negate = true;                           break;
 -            case (wchar_t)')':
 -              ++curInd;
 -              *end = registerNode(new NFALookBehindUNode(L"", true));
 -              return *end;
 -            default:  raiseError(); return NULL;
 -            }
 -          }
 -          ++curInd;
 -        }
 -        noncap = 1;
 -        grc = --nonCapGroupCount;
 -      }
 -
 -      if (noncap) cur = start = registerNode(new NFAGroupHeadUNode(grc));
 -      else        cur = start = registerNode(new NFASubStartUNode);
 -    }
 -    else cur = start = registerNode(new NFAGroupHeadUNode(grc));
 -  }
 -  else cur = start = registerNode(new NFASubStartUNode);
 -  while (curInd < (int)pattern.size())
 -  {
 -    wchar_t ch = pattern[curInd++];
 -
 -    next = NULL;
 -    if (error) return NULL;
 -    switch (ch)
 -    {
 -    case (wchar_t)'^':
 -      if ((flags & WCPattern::MULTILINE_MATCHING) != 0) next = registerNode(new NFAStartOfLineUNode);
 -      else                                            next = registerNode(new NFAStartOfInputUNode);
 -      break;
 -    case (wchar_t)'$':
 -      if ((flags & WCPattern::MULTILINE_MATCHING) != 0) next = registerNode(new NFAEndOfLineUNode);
 -      else                                            next = registerNode(new NFAEndOfInputUNode(0));
 -      break;
 -    case (wchar_t)'|':
 -      --groupCount;
 -      cur->next = registerNode(new NFAAcceptUNode);
 -      cur = start = registerNode(new NFAOrUNode(start, parse(inParen, 1)));
 -      break;
 -    case (wchar_t)'\\':
 -      if      (curInd < (int)pattern.size())
 -      {
 -        bool eoi = 0;
 -        switch (pattern[curInd])
 -        {
 -        case (wchar_t)'1':
 -        case (wchar_t)'2':
 -        case (wchar_t)'3':
 -        case (wchar_t)'4':
 -        case (wchar_t)'5':
 -        case (wchar_t)'6':
 -        case (wchar_t)'7':
 -        case (wchar_t)'8':
 -        case (wchar_t)'9': next = parseBackref(); break;
 -        case (wchar_t)'A': ++curInd; next = registerNode(new NFAStartOfInputUNode);     break;
 -        case (wchar_t)'B': ++curInd; next = registerNode(new NFAWordBoundaryUNode(0));  break;
 -        case (wchar_t)'b': ++curInd; next = registerNode(new NFAWordBoundaryUNode(1));  break;
 -        case (wchar_t)'G': ++curInd; next = registerNode(new NFAEndOfMatchUNode);       break;
 -        case (wchar_t)'Z': eoi = 1;
 -        case (wchar_t)'z': ++curInd; next = registerNode(new NFAEndOfInputUNode(eoi));  break;
 -        default:
 -          t = parseEscape(inv, quo);
 -          //printf("inv quo classes { %c %c %s }\n", inv ? (wchar_t)'t' : (wchar_t)'f', quo ? (wchar_t)'t' : (wchar_t)'f', t.c_str());
 -          if (!quo)
 -          {
 -            if (t.size() > 1 || inv)
 -            {
 -              if ((flags & WCPattern::CASE_INSENSITIVE) != 0) next = registerNode(new NFACIClassUNode(t, inv));
 -              else                                            next = registerNode(new NFAClassUNode(t, inv));
 -            }
 -            else
 -            {
 -              next = registerNode(new NFACharUNode(t[0]));
 -            }
 -          }
 -          else
 -          {
 -            next = parseQuote();
 -          }
 -        }
 -      }
 -      else raiseError();
 -      break;
 -    case (wchar_t)'[':
 -      if ((flags & WCPattern::CASE_INSENSITIVE) == 0)
 -      {
 -        NFAClassUNode * clazz = new NFAClassUNode();
 -        bkstring s = parseClass();
 -        for (int i = 0; i < (int)s.size(); ++i) clazz->vals[s[i]] = 1;
 -        next = registerNode(clazz);
 -      }
 -      else
 -      {
 -        NFACIClassUNode * clazz = new NFACIClassUNode();
 -        bkstring s = parseClass();
 -        for (int i = 0; i < (int)s.size(); ++i) clazz->vals[to_lower(s[i])] = 1;
 -        next = registerNode(clazz);
 -      }
 -      break;
 -    case (wchar_t)'.':
 -      {
 -        bool useN = 1, useR = 1;
 -        NFAClassUNode * clazz = new NFAClassUNode(1);
 -        if ((flags & WCPattern::UNIX_LINE_MODE)  != 0) useR = 0;
 -        if ((flags & WCPattern::DOT_MATCHES_ALL) != 0) useN = useR = 0;
 -        if (useN) clazz->vals[(wchar_t)'\n'] = 1;
 -        if (useR) clazz->vals[(wchar_t)'\r'] = 1;
 -        next = registerNode(clazz);
 -      }
 -      break;
 -    case (wchar_t)'(':
 -      {
 -        NFAUNode * end, * t1, * t2;
 -        t1 = parse(1, 0, &end);
 -        if (!t1) raiseError();
 -        else if (t1->isGroupHeadNode() && (t2 = quantifyGroup(t1, end, grc)) != NULL)
 -        {
 -          cur->next = t2;
 -          cur = t2->next;
 -        }
 -        else
 -        {
 -          cur->next = t1;
 -          cur = end;
 -        }
 -      }
 -      break;
 -    case (wchar_t)')':
 -      if (!inParen) raiseError();
 -      else if (inOr)
 -      {
 -        --curInd;
 -        cur = cur->next = registerNode(new NFAAcceptUNode);
 -        flags = oldFlags;
 -        return start;
 -      }
 -      else
 -      {
 -        if (ahead)
 -        {
 -          cur = cur->next = registerNode(new NFAAcceptUNode);
 -          flags = oldFlags;
 -          return *end = registerNode(new NFALookAheadUNode(start, pos));
 -        }
 -        else if (indep)
 -        {
 -          cur = cur->next = registerNode(new NFAAcceptUNode);
 -          flags = oldFlags;
 -          return *end = registerNode(new NFAPossessiveQuantifierUNode(this, start, 1, 1));
 -        }
 -        else // capping or noncapping, it doesnt matter
 -        {
 -          *end = cur = cur->next = registerNode(new NFAGroupTailUNode(grc));
 -          next = quantifyGroup(start, *end, grc);
 -          if (next)
 -          {
 -            start = next;
 -            *end = next->next;
 -          }
 -          flags = oldFlags;
 -          return start;
 -        }
 -      }
 -      break;
 -    case (wchar_t)'{': // registered pattern
 -      cur->next = parseRegisteredWCPattern(&next);
 -      if (cur->next) cur = next;
 -      break;
 -    case (wchar_t)'*':
 -    case (wchar_t)'+':
 -    case (wchar_t)'?':
 -//    case (wchar_t)'}':
 -//    case (wchar_t)']':
 -      raiseError();
 -      break;
 -    default:
 -      if ((flags & WCPattern::CASE_INSENSITIVE) != 0) next = registerNode(new NFACICharUNode(ch));
 -      else                                          next = registerNode(new NFACharUNode(ch));
 -      break;
 -    }
 -    if (next) cur = cur->next = quantify(next);
 -  }
 -  if (inParen) raiseError();
 -  else
 -  {
 -    if (inOr) cur = cur->next = registerNode(new NFAAcceptUNode);
 -    if (end) *end = cur;
 -  }
 -
 -  flags = oldFlags;
 -  if (error) return NULL;
 -
 -  return start;
 -}
 -
 -WCPattern * WCPattern::compile(const bkstring & pattern, const unsigned long mode)
 -{
 -  WCPattern * p = new WCPattern(pattern);
 -  NFAUNode * end;
 -
 -  p->flags = mode;
 -  if ((mode & WCPattern::LITERAL) != 0)
 -  {
 -    p->head = p->registerNode(new NFAStartUNode);
 -    if ((mode & WCPattern::CASE_INSENSITIVE) != 0)  p->head->next = p->registerNode(new NFACIQuoteUNode(pattern));
 -    else                                          p->head->next = p->registerNode(new NFAQuoteUNode(pattern));
 -    p->head->next->next = p->registerNode(new NFAEndUNode);
 -  }
 -  else
 -  {
 -    p->head = p->parse(0, 0, &end);
 -    if (!p->head)
 -    {
 -      delete p;
 -      p = NULL;
 -    }
 -    else
 -    {
 -      if (!(p->head && p->head->isStartOfInputNode()))
 -      {
 -        NFAUNode * n = p->registerNode(new NFAStartUNode);
 -        n->next = p->head;
 -        p->head = n;
 -      }
 -      end->next = p->registerNode(new NFAEndUNode);
 -    }
 -  }
 -  if (p != NULL)
 -  {
 -    p->matcher = new WCMatcher(p, L"");
 -  }
 -
 -  return p;
 -}
 -
 -WCPattern * WCPattern::compileAndKeep(const bkstring & pattern, const unsigned long mode)
 -{
 -  WCPattern * ret = NULL;
 -  std::map<bkstring, WCPattern*>::iterator it = compiledWCPatterns.find(pattern);
 -
 -  if (it != compiledWCPatterns.end())
 -  {
 -    ret = it->second;
 -  }
 -  else
 -  {
 -    ret = compile(pattern, mode);
 -    compiledWCPatterns[pattern] = ret;
 -  }
 -
 -  return ret;
 -}
 -bkstring WCPattern::replace(const bkstring & pattern, const bkstring & str,
 -                                     const bkstring & replacementText, const unsigned long mode)
 -{
 -  bkstring ret;
 -  WCPattern * p = WCPattern::compile(pattern, mode);
 -  if (p)
 -  {
 -    ret = p->replace(str, replacementText);
 -    delete p;
 -  }
 -  return ret;
 -}
 -
 -std::vector<bkstring> WCPattern::split(const bkstring & pattern, const bkstring & str, const bool keepEmptys,
 -                              const unsigned long limit, const unsigned long mode)
 -{
 -  std::vector<bkstring> ret;
 -  WCPattern * p = WCPattern::compile(pattern, mode);
 -  if (p)
 -  {
 -    ret = p->split(str, keepEmptys, limit);
 -    delete p;
 -  }
 -  return ret;
 -}
 -
 -std::vector<bkstring> WCPattern::findAll(const bkstring & pattern, const bkstring & str, const unsigned long mode)
 -{
 -  std::vector<bkstring> ret;
 -  WCPattern * p = WCPattern::compile(pattern, mode);
 -  if (p)
 -  {
 -    ret = p->findAll(str);
 -    delete p;
 -  }
 -  return ret;
 -}
 -
 -bool WCPattern::matches(const bkstring & pattern, const bkstring & str, const unsigned long mode)
 -{
 -  bool ret = 0;
 -  WCPattern * p = compile(pattern, mode);
 -
 -  if (p)
 -  {
 -    ret = p->matches(str);
 -    delete p;
 -  }
 -
 -  return ret;
 -}
 -
 -bool WCPattern::registerWCPattern(const bkstring & name, const bkstring & pattern, const unsigned long mode)
 -{
 -  WCPattern * p = WCPattern::compile(pattern, mode);
 -  if (!p) return 0;
 -  WCPattern::registeredWCPatterns[name] = std::make_pair(pattern, mode);
 -  delete p;
 -  return 1;
 +	NFAUNode * start, *cur, *next = NULL;
 +	CMString t;
 +	int grc = groupCount++;
 +	bool inv, quo;
 +	bool ahead = 0, pos = 0, noncap = 0, indep = 0;
 +	unsigned long oldFlags = flags;
 +
 +	if (inParen)
 +	{
 +		if (pattern[curInd] == '?')
 +		{
 +			++curInd;
 +			--groupCount;
 +			if (pattern[curInd] == ':')   { noncap = 1; ++curInd;     grc = --nonCapGroupCount; }
 +			else if (pattern[curInd] == '=')   { ++curInd;     ahead = 1;  pos = 1; }
 +			else if (pattern[curInd] == '!')   { ++curInd;     ahead = 1;  pos = 0; }
 +			else if (pattern.Mid(curInd, 2) == L"<=")  { curInd += 2;  return parseBehind(1, end); }
 +			else if (pattern.Mid(curInd, 2) == L"<!")  { curInd += 2;  return parseBehind(0, end); }
 +			else if (pattern[curInd] == '>')   { ++curInd;     indep = 1; }
 +			else
 +			{
 +				bool negate = false, done = false;
 +				while (!done)
 +				{
 +					if (curInd >= pattern.GetLength())
 +					{
 +						raiseError();
 +						return NULL;
 +					}
 +					else if (negate)
 +					{
 +						switch (pattern[curInd])
 +						{
 +						case 'i': flags &= ~WCPattern::CASE_INSENSITIVE;   break;
 +						case 'd': flags &= ~WCPattern::UNIX_LINE_MODE;     break;
 +						case 'm': flags &= ~WCPattern::MULTILINE_MATCHING; break;
 +						case 's': flags &= ~WCPattern::DOT_MATCHES_ALL;    break;
 +						case ':': done = true;                             break;
 +						case ')':
 +							++curInd;
 +							*end = registerNode(new NFALookBehindUNode(L"", true));
 +							return *end;
 +						case '-':
 +						default: raiseError(); return NULL;
 +						}
 +					}
 +					else
 +					{
 +						switch (pattern[curInd])
 +						{
 +						case 'i': flags |= WCPattern::CASE_INSENSITIVE;    break;
 +						case 'd': flags |= WCPattern::UNIX_LINE_MODE;      break;
 +						case 'm': flags |= WCPattern::MULTILINE_MATCHING;  break;
 +						case 's': flags |= WCPattern::DOT_MATCHES_ALL;     break;
 +						case ':': done = true;                             break;
 +						case '-': negate = true;                           break;
 +						case ')':
 +							++curInd;
 +							*end = registerNode(new NFALookBehindUNode(L"", true));
 +							return *end;
 +						default:  raiseError(); return NULL;
 +						}
 +					}
 +					++curInd;
 +				}
 +				noncap = 1;
 +				grc = --nonCapGroupCount;
 +			}
 +
 +			if (noncap) cur = start = registerNode(new NFAGroupHeadUNode(grc));
 +			else        cur = start = registerNode(new NFASubStartUNode);
 +		}
 +		else cur = start = registerNode(new NFAGroupHeadUNode(grc));
 +	}
 +	else cur = start = registerNode(new NFASubStartUNode);
 +	while (curInd < pattern.GetLength())
 +	{
 +		wchar_t ch = pattern[curInd++];
 +
 +		next = NULL;
 +		if (error) return NULL;
 +		switch (ch) {
 +		case '^':
 +			if ((flags & WCPattern::MULTILINE_MATCHING) != 0) next = registerNode(new NFAStartOfLineUNode);
 +			else                                            next = registerNode(new NFAStartOfInputUNode);
 +			break;
 +		case '$':
 +			if ((flags & WCPattern::MULTILINE_MATCHING) != 0) next = registerNode(new NFAEndOfLineUNode);
 +			else                                            next = registerNode(new NFAEndOfInputUNode(0));
 +			break;
 +		case '|':
 +			--groupCount;
 +			cur->next = registerNode(new NFAAcceptUNode);
 +			cur = start = registerNode(new NFAOrUNode(start, parse(inParen, 1)));
 +			break;
 +		case '\\':
 +			if (curInd < pattern.GetLength()) {
 +				bool eoi = 0;
 +				switch (pattern[curInd]) {
 +				case '1':
 +				case '2':
 +				case '3':
 +				case '4':
 +				case '5':
 +				case '6':
 +				case '7':
 +				case '8':
 +				case '9': next = parseBackref(); break;
 +				case 'A': ++curInd; next = registerNode(new NFAStartOfInputUNode);     break;
 +				case 'B': ++curInd; next = registerNode(new NFAWordBoundaryUNode(0));  break;
 +				case 'b': ++curInd; next = registerNode(new NFAWordBoundaryUNode(1));  break;
 +				case 'G': ++curInd; next = registerNode(new NFAEndOfMatchUNode);       break;
 +				case 'Z': eoi = 1;
 +				case 'z': ++curInd; next = registerNode(new NFAEndOfInputUNode(eoi));  break;
 +				default:
 +					t = parseEscape(inv, quo);
 +					//printf("inv quo classes { %c %c %s }\n", inv ? 't' : 'f', quo ? 't' : 'f', t.c_str());
 +					if (!quo) {
 +						if (t.GetLength() > 1 || inv) {
 +							if ((flags & WCPattern::CASE_INSENSITIVE) != 0) next = registerNode(new NFACIClassUNode(t, inv));
 +							else                                            next = registerNode(new NFAClassUNode(t, inv));
 +						}
 +						else next = registerNode(new NFACharUNode(t[0]));
 +					}
 +					else next = parseQuote();
 +				}
 +			}
 +			else raiseError();
 +			break;
 +		case '[':
 +			if ((flags & WCPattern::CASE_INSENSITIVE) == 0) {
 +				NFAClassUNode * clazz = new NFAClassUNode();
 +				CMString s = parseClass();
 +				for (int i = 0; i < (int)s.GetLength(); ++i) clazz->vals[s[i]] = 1;
 +				next = registerNode(clazz);
 +			}
 +			else {
 +				NFACIClassUNode * clazz = new NFACIClassUNode();
 +				CMString s = parseClass();
 +				for (int i = 0; i < s.GetLength(); ++i) clazz->vals[to_lower(s[i])] = 1;
 +				next = registerNode(clazz);
 +			}
 +			break;
 +		case '.':
 +			{
 +				bool useN = 1, useR = 1;
 +				NFAClassUNode * clazz = new NFAClassUNode(1);
 +				if ((flags & WCPattern::UNIX_LINE_MODE) != 0) useR = 0;
 +				if ((flags & WCPattern::DOT_MATCHES_ALL) != 0) useN = useR = 0;
 +				if (useN) clazz->vals['\n'] = 1;
 +				if (useR) clazz->vals['\r'] = 1;
 +				next = registerNode(clazz);
 +			}
 +			break;
 +		case '(':
 +			{
 +				NFAUNode *end, *t1, *t2;
 +				t1 = parse(1, 0, &end);
 +				if (!t1) raiseError();
 +				else if (t1->isGroupHeadNode() && (t2 = quantifyGroup(t1, end, grc)) != NULL) {
 +					cur->next = t2;
 +					cur = t2->next;
 +				}
 +				else {
 +					cur->next = t1;
 +					cur = end;
 +				}
 +			}
 +			break;
 +		case ')':
 +			if (!inParen) raiseError();
 +			else if (inOr)
 +			{
 +				--curInd;
 +				cur = cur->next = registerNode(new NFAAcceptUNode);
 +				flags = oldFlags;
 +				return start;
 +			}
 +			else
 +			{
 +				if (ahead)
 +				{
 +					cur = cur->next = registerNode(new NFAAcceptUNode);
 +					flags = oldFlags;
 +					return *end = registerNode(new NFALookAheadUNode(start, pos));
 +				}
 +				else if (indep)
 +				{
 +					cur = cur->next = registerNode(new NFAAcceptUNode);
 +					flags = oldFlags;
 +					return *end = registerNode(new NFAPossessiveQuantifierUNode(this, start, 1, 1));
 +				}
 +				else // capping or noncapping, it doesnt matter
 +				{
 +					*end = cur = cur->next = registerNode(new NFAGroupTailUNode(grc));
 +					next = quantifyGroup(start, *end, grc);
 +					if (next)
 +					{
 +						start = next;
 +						*end = next->next;
 +					}
 +					flags = oldFlags;
 +					return start;
 +				}
 +			}
 +			break;
 +		case '{': // registered pattern
 +			cur->next = parseRegisteredWCPattern(&next);
 +			if (cur->next) cur = next;
 +			break;
 +		case '*':
 +		case '+':
 +		case '?':
 +			//    case '}':
 +			//    case ']':
 +			raiseError();
 +			break;
 +		default:
 +			if ((flags & WCPattern::CASE_INSENSITIVE) != 0) next = registerNode(new NFACICharUNode(ch));
 +			else                                          next = registerNode(new NFACharUNode(ch));
 +			break;
 +		}
 +		if (next) cur = cur->next = quantify(next);
 +	}
 +	if (inParen) raiseError();
 +	else
 +	{
 +		if (inOr) cur = cur->next = registerNode(new NFAAcceptUNode);
 +		if (end) *end = cur;
 +	}
 +
 +	flags = oldFlags;
 +	if (error) return NULL;
 +
 +	return start;
 +}
 +
 +WCPattern * WCPattern::compile(const CMString & pattern, const unsigned long mode)
 +{
 +	WCPattern * p = new WCPattern(pattern);
 +	NFAUNode * end;
 +
 +	p->flags = mode;
 +	if ((mode & WCPattern::LITERAL) != 0) {
 +		p->head = p->registerNode(new NFAStartUNode);
 +		if ((mode & WCPattern::CASE_INSENSITIVE) != 0)  p->head->next = p->registerNode(new NFACIQuoteUNode(pattern));
 +		else                                          p->head->next = p->registerNode(new NFAQuoteUNode(pattern));
 +		p->head->next->next = p->registerNode(new NFAEndUNode);
 +	}
 +	else {
 +		p->head = p->parse(0, 0, &end);
 +		if (!p->head) {
 +			delete p;
 +			p = NULL;
 +		}
 +		else {
 +			if (!(p->head && p->head->isStartOfInputNode())) {
 +				NFAUNode * n = p->registerNode(new NFAStartUNode);
 +				n->next = p->head;
 +				p->head = n;
 +			}
 +			end->next = p->registerNode(new NFAEndUNode);
 +		}
 +	}
 +
 +	if (p != NULL)
 +		p->matcher = new WCMatcher(p, L"");
 +
 +	return p;
 +}
 +
 +WCPattern * WCPattern::compileAndKeep(const CMString & pattern, const unsigned long mode)
 +{
 +	WCPattern * ret = NULL;
 +	std::map<CMString, WCPattern*>::iterator it = compiledWCPatterns.find(pattern);
 +	if (it != compiledWCPatterns.end())
 +		ret = it->second;
 +	else {
 +		ret = compile(pattern, mode);
 +		compiledWCPatterns[pattern] = ret;
 +	}
 +
 +	return ret;
 +}
 +CMString WCPattern::replace(const CMString & pattern, const CMString & str,
 +	const CMString & replacementText, const unsigned long mode)
 +{
 +	CMString ret;
 +	WCPattern * p = WCPattern::compile(pattern, mode);
 +	if (p)
 +	{
 +		ret = p->replace(str, replacementText);
 +		delete p;
 +	}
 +	return ret;
 +}
 +
 +std::vector<CMString> WCPattern::split(const CMString & pattern, const CMString & str, const bool keepEmptys,
 +	const unsigned long limit, const unsigned long mode)
 +{
 +	std::vector<CMString> ret;
 +	WCPattern *p = WCPattern::compile(pattern, mode);
 +	if (p) {
 +		ret = p->split(str, keepEmptys, limit);
 +		delete p;
 +	}
 +	return ret;
 +}
 +
 +std::vector<CMString> WCPattern::findAll(const CMString & pattern, const CMString & str, const unsigned long mode)
 +{
 +	std::vector<CMString> ret;
 +	WCPattern *p = WCPattern::compile(pattern, mode);
 +	if (p) {
 +		ret = p->findAll(str);
 +		delete p;
 +	}
 +	return ret;
 +}
 +
 +bool WCPattern::matches(const CMString & pattern, const CMString & str, const unsigned long mode)
 +{
 +	bool ret = 0;
 +	WCPattern * p = compile(pattern, mode);
 +
 +	if (p)
 +	{
 +		ret = p->matches(str);
 +		delete p;
 +	}
 +
 +	return ret;
 +}
 +
 +bool WCPattern::registerWCPattern(const CMString & name, const CMString & pattern, const unsigned long mode)
 +{
 +	WCPattern * p = WCPattern::compile(pattern, mode);
 +	if (!p) return 0;
 +	WCPattern::registeredWCPatterns[name] = std::make_pair(pattern, mode);
 +	delete p;
 +	return 1;
  }
  void WCPattern::unregisterWCPatterns()
  {
 -  registeredWCPatterns.clear();
 +	registeredWCPatterns.clear();
  }
  void WCPattern::clearWCPatternCache()
  {
 -  std::map<bkstring, WCPattern*>::iterator it;
 -  for (it = compiledWCPatterns.begin(); it != compiledWCPatterns.end(); ++it)
 -  {
 -    delete it->second;
 -  }
 -  compiledWCPatterns.clear();
 +	std::map<CMString, WCPattern*>::iterator it;
 +	for (it = compiledWCPatterns.begin(); it != compiledWCPatterns.end(); ++it)
 +		delete it->second;
 +
 +	compiledWCPatterns.clear();
  }
 -std::pair<bkstring, int>  WCPattern::findNthMatch(const bkstring & pattern, const bkstring & str,
 -                                         const int matchNum, const unsigned long mode)
 +std::pair<CMString, int>  WCPattern::findNthMatch(const CMString & pattern, const CMString & str,
 +	const int matchNum, const unsigned long mode)
  {
 -  std::pair<bkstring, int> ret;
 -  WCPattern * p = WCPattern::compile(pattern, mode);
 +	std::pair<CMString, int> ret;
 +	WCPattern * p = WCPattern::compile(pattern, mode);
 -  ret.second = -1;
 -  if (p)
 -  {
 -    int i = -1;
 -    p->matcher->setString(str);
 -    while (i < matchNum && p->matcher->findNextMatch()) { ++i; }
 -    if (i == matchNum && p->matcher->getStartingIndex() >= 0)
 -    {
 -      ret.first = p->matcher->getGroup(0);
 -      ret.second = p->matcher->getStartingIndex();
 -    }
 -    delete p;
 -  }
 +	ret.second = -1;
 +	if (p)
 +	{
 +		int i = -1;
 +		p->matcher->setString(str);
 +		while (i < matchNum && p->matcher->findNextMatch()) { ++i; }
 +		if (i == matchNum && p->matcher->getStartingIndex() >= 0)
 +		{
 +			ret.first = p->matcher->getGroup(0);
 +			ret.second = p->matcher->getStartingIndex();
 +		}
 +		delete p;
 +	}
 -  return ret;
 +	return ret;
  }
  WCPattern::~WCPattern()
  {
 -  /*
 -  nodes.clear();
 -  if (head) head->findAllNodes(nodes);
 -  */
 -  if (matcher) delete matcher;
 -  for (std::map<NFAUNode*, bool>::iterator it = nodes.begin(); it != nodes.end(); ++it) delete it->first;
 +	/*
 +	nodes.Empty();
 +	if (head) head->findAllNodes(nodes);
 +	*/
 +	if (matcher) delete matcher;
 +	for (std::map<NFAUNode*, bool>::iterator it = nodes.begin(); it != nodes.end(); ++it)
 +		delete it->first;
  }
 -bkstring WCPattern::replace(const bkstring & str, const bkstring & replacementText)
 +CMString WCPattern::replace(const CMString & str, const CMString & replacementText)
  {
 -  int li = 0;
 -  bkstring ret = L"";
 +	int li = 0;
 +	CMString ret = L"";
 -  matcher->setString(str);
 -  while (matcher->findNextMatch())
 -  {
 -    ret += str.substr(li, matcher->getStartingIndex() - li);
 -    ret += matcher->replaceWithGroups(replacementText);
 -    li = matcher->getEndingIndex();
 -  }
 -  ret += str.substr(li);
 +	matcher->setString(str);
 +	while (matcher->findNextMatch())
 +	{
 +		ret += str.Mid(li, matcher->getStartingIndex() - li);
 +		ret += matcher->replaceWithGroups(replacementText);
 +		li = matcher->getEndingIndex();
 +	}
 +	ret += str.Mid(li);
 -  return ret;
 +	return ret;
  }
 -std::vector<bkstring> WCPattern::split(const bkstring & str, const bool keepEmptys, const unsigned long limit)
 +std::vector<CMString> WCPattern::split(const CMString & str, const bool keepEmptys, const unsigned long limit)
  {
 -  unsigned long lim = (limit == 0 ? MAX_QMATCH : limit);
 -  int li = 0;
 -  std::vector<bkstring> ret;
 +	unsigned long lim = (limit == 0 ? MAX_QMATCH : limit);
 +	int li = 0;
 +	std::vector<CMString> ret;
 -  matcher->setString(str);
 +	matcher->setString(str);
 -  while (matcher->findNextMatch() && ret.size() < lim)
 -  {
 -    if (matcher->getStartingIndex() == 0 && keepEmptys) ret.push_back(L"");
 -    if ((matcher->getStartingIndex() != matcher->getEndingIndex()) || keepEmptys)
 -    {
 -      if (li != matcher->getStartingIndex() || keepEmptys)
 -      {
 -        ret.push_back(str.substr(li, matcher->getStartingIndex() - li));
 -      }
 -      li = matcher->getEndingIndex();
 -    }
 -  }
 -  if (li < (int)str.size()) ret.push_back(str.substr(li));
 +	while (matcher->findNextMatch() && ret.size() < lim)
 +	{
 +		if (matcher->getStartingIndex() == 0 && keepEmptys) ret.push_back(L"");
 +		if ((matcher->getStartingIndex() != matcher->getEndingIndex()) || keepEmptys)
 +		{
 +			if (li != matcher->getStartingIndex() || keepEmptys)
 +			{
 +				ret.push_back(str.Mid(li, matcher->getStartingIndex() - li));
 +			}
 +			li = matcher->getEndingIndex();
 +		}
 +	}
 +	if (li < str.GetLength()) ret.push_back(str.Mid(li));
 -  return ret;
 +	return ret;
  }
 -std::vector<bkstring> WCPattern::findAll(const bkstring & str)
 +std::vector<CMString> WCPattern::findAll(const CMString & str)
  {
 -  matcher->setString(str);
 -  return matcher->findAll();
 +	matcher->setString(str);
 +	return matcher->findAll();
  }
 -bool WCPattern::matches(const bkstring & str)
 +bool WCPattern::matches(const CMString & str)
  {
 -  matcher->setString(str);
 -  return matcher->matches();
 +	matcher->setString(str);
 +	return matcher->matches();
  }
  unsigned long WCPattern::getFlags() const
  {
 -  return flags;
 +	return flags;
  }
 -bkstring WCPattern::getWCPattern() const
 +CMString WCPattern::getWCPattern() const
  {
 -  return pattern;
 +	return pattern;
  }
 -WCMatcher * WCPattern::createWCMatcher(const bkstring & str)
 +WCMatcher * WCPattern::createWCMatcher(const CMString & str)
  {
 -  return new WCMatcher(this, str);
 +	return new WCMatcher(this, str);
  }
  // NFAUNode
 @@ -1196,227 +1133,233 @@ NFAUNode::NFAUNode() { next = NULL; }  NFAUNode::~NFAUNode() { }
  void NFAUNode::findAllNodes(std::map<NFAUNode*, bool> & soFar)
  {
 -  if (soFar.find(this) == soFar.end()) return;
 -  soFar[this] = 1;
 -  if (next) next->findAllNodes(soFar);
 +	if (soFar.find(this) == soFar.end()) return;
 +	soFar[this] = 1;
 +	if (next) next->findAllNodes(soFar);
  }
  // NFACharUNode
  NFACharUNode::NFACharUNode(const wchar_t c) { ch = c; }
 -int NFACharUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFACharUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd < (int)str.size() && str[curInd] == ch) return next->match(str, matcher, curInd + 1);
 -  return -1;
 +	if (curInd < str.GetLength() && str[curInd] == ch)
 +		return next->match(str, matcher, curInd + 1);
 +	return -1;
  }
  // NFACICharUNode
  NFACICharUNode::NFACICharUNode(const wchar_t c) { ch = to_lower(c); }
 -int NFACICharUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFACICharUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd < (int)str.size() && to_lower(str[curInd]) == ch) return next->match(str, matcher, curInd + 1);
 -  return -1;
 +	if (curInd < str.GetLength() && to_lower(str[curInd]) == ch)
 +		return next->match(str, matcher, curInd + 1);
 +	return -1;
  }
  // NFAStartUNode
  NFAStartUNode::NFAStartUNode() { }
 -int NFAStartUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  int ret = -1, ci = curInd;
 -
 -  matcher->starts[0] = curInd;
 -  if ((matcher->getFlags() & WCMatcher::MATCH_ENTIRE_STRING) == (unsigned int)WCMatcher::MATCH_ENTIRE_STRING)
 -  {
 -    if (curInd != 0)
 -    {
 -      matcher->starts[0] = -1;
 -      return -1;
 -    }
 -    return next->match(str, matcher, 0);
 -  }
 -  while ((ret = next->match(str, matcher, ci)) == -1 && ci < (int)str.size())
 -  {
 -    matcher->clearGroups();
 -    matcher->starts[0] = ++ci;
 -  }
 -  if (ret < 0) matcher->starts[0] = -1;
 -  return ret;
 +int NFAStartUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	int ret = -1, ci = curInd;
 +
 +	matcher->starts[0] = curInd;
 +	if ((matcher->getFlags() & WCMatcher::MATCH_ENTIRE_STRING) == (unsigned int)WCMatcher::MATCH_ENTIRE_STRING)
 +	{
 +		if (curInd != 0)
 +		{
 +			matcher->starts[0] = -1;
 +			return -1;
 +		}
 +		return next->match(str, matcher, 0);
 +	}
 +	while ((ret = next->match(str, matcher, ci)) == -1 && ci < str.GetLength())
 +	{
 +		matcher->clearGroups();
 +		matcher->starts[0] = ++ci;
 +	}
 +	if (ret < 0) matcher->starts[0] = -1;
 +	return ret;
  }
  // NFAEndUNode
  NFAEndUNode::NFAEndUNode() { }
 -int NFAEndUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAEndUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  matcher->ends[0] = curInd;
 -  if ((matcher->getFlags() & WCMatcher::MATCH_ENTIRE_STRING) != 0)
 -  {
 -    if (curInd == (int)str.size()) return curInd;
 -    matcher->ends[0] = -1;
 -    return -1;
 -  }
 -  return curInd;
 +	matcher->ends[0] = curInd;
 +	if ((matcher->getFlags() & WCMatcher::MATCH_ENTIRE_STRING) != 0)
 +	{
 +		if (curInd == str.GetLength())
 +			return curInd;
 +		matcher->ends[0] = -1;
 +		return -1;
 +	}
 +	return curInd;
  }
  // NFAQuantifierUNode
  void NFAQuantifierUNode::findAllNodes(std::map<NFAUNode*, bool> & soFar)
  {
 -  inner->findAllNodes(soFar);
 -  NFAUNode::findAllNodes(soFar);
 +	inner->findAllNodes(soFar);
 +	NFAUNode::findAllNodes(soFar);
  }
  NFAQuantifierUNode::NFAQuantifierUNode(WCPattern * pat, NFAUNode * internal, const int minMatch, const int maxMatch)
  {
 -  inner = internal;
 -  inner->next = pat->registerNode(new NFAAcceptUNode);
 -  min = (minMatch < WCPattern::MIN_QMATCH) ? WCPattern::MIN_QMATCH : minMatch;
 -  max = (maxMatch > WCPattern::MAX_QMATCH) ? WCPattern::MAX_QMATCH : maxMatch;
 +	inner = internal;
 +	inner->next = pat->registerNode(new NFAAcceptUNode);
 +	min = (minMatch < WCPattern::MIN_QMATCH) ? WCPattern::MIN_QMATCH : minMatch;
 +	max = (maxMatch > WCPattern::MAX_QMATCH) ? WCPattern::MAX_QMATCH : maxMatch;
  }
 -int NFAQuantifierUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAQuantifierUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int i0, i1, i2 = 0;
 +	int i0, i1, i2 = 0;
 -  i0 = i1 = curInd;
 -  while (i2 < min)
 -  {
 +	i0 = i1 = curInd;
 +	while (i2 < min)
 +	{
 -    ++i2;
 -    i1 = inner->match(str, matcher, i0);
 -    if (i1 <= i0) return i1; // i1 < i0 means i1 is -1
 -    i0 = i1;
 -  }
 +		++i2;
 +		i1 = inner->match(str, matcher, i0);
 +		if (i1 <= i0) return i1; // i1 < i0 means i1 is -1
 +		i0 = i1;
 +	}
 -  return i1;
 +	return i1;
  }
  // NFAGreedyQuantifierUNode
  NFAGreedyQuantifierUNode::NFAGreedyQuantifierUNode(WCPattern * pat, NFAUNode * internal, const int minMatch, const int maxMatch)
 -                        : NFAQuantifierUNode(pat, internal, minMatch, maxMatch) { }
 -int NFAGreedyQuantifierUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +: NFAQuantifierUNode(pat, internal, minMatch, maxMatch) { }
 +int NFAGreedyQuantifierUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int t = NFAQuantifierUNode::match(str, matcher, curInd);
 -  if (t != -1) return matchInternal(str, matcher, t, min);
 -  return t;
 +	int t = NFAQuantifierUNode::match(str, matcher, curInd);
 +	if (t != -1) return matchInternal(str, matcher, t, min);
 +	return t;
  }
 -int NFAGreedyQuantifierUNode::matchInternal(const bkstring & str, WCMatcher * matcher, const int curInd, const int soFar) const
 +int NFAGreedyQuantifierUNode::matchInternal(const CMString & str, WCMatcher * matcher, const int curInd, const int soFar) const
  {
 -  if (soFar >= max) return next->match(str, matcher, curInd);
 +	if (soFar >= max) return next->match(str, matcher, curInd);
 -  int i, j;
 +	int i, j;
 -  i = inner->match(str, matcher, curInd);
 -  if (i != -1)
 -  {
 -    j = matchInternal(str, matcher, i, soFar + 1);
 -    if (j != -1) return j;
 -  }
 -  return next->match(str, matcher, curInd);
 +	i = inner->match(str, matcher, curInd);
 +	if (i != -1)
 +	{
 +		j = matchInternal(str, matcher, i, soFar + 1);
 +		if (j != -1) return j;
 +	}
 +	return next->match(str, matcher, curInd);
  }
  // NFALazyQuantifierUNode
  NFALazyQuantifierUNode::NFALazyQuantifierUNode(WCPattern * pat, NFAUNode * internal, const int minMatch, const int maxMatch)
 -                      : NFAQuantifierUNode(pat, internal, minMatch, maxMatch) { }
 -int NFALazyQuantifierUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  int i, j, m = NFAQuantifierUNode::match(str, matcher, curInd);
 -
 -  if (m == -1) return -1;
 -
 -  for (i = min; i < max; ++i)
 -  {
 -    j = next->match(str, matcher, m);
 -    if (j == -1)
 -    {
 -      j = inner->match(str, matcher, m);
 -      // if j < m, then j is -1, so we bail.
 -      // if j == m, then we would just go and call next->match on the same index,
 -      // but it already failed trying to match right there, so we know we can
 -      // just bail
 -      if (j <= m) return -1;
 -      m = j;
 -    }
 -    else return j;
 -  }
 -  return next->match(str, matcher, m);
 +: NFAQuantifierUNode(pat, internal, minMatch, maxMatch) { }
 +int NFALazyQuantifierUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	int i, j, m = NFAQuantifierUNode::match(str, matcher, curInd);
 +
 +	if (m == -1) return -1;
 +
 +	for (i = min; i < max; ++i)
 +	{
 +		j = next->match(str, matcher, m);
 +		if (j == -1)
 +		{
 +			j = inner->match(str, matcher, m);
 +			// if j < m, then j is -1, so we bail.
 +			// if j == m, then we would just go and call next->match on the same index,
 +			// but it already failed trying to match right there, so we know we can
 +			// just bail
 +			if (j <= m) return -1;
 +			m = j;
 +		}
 +		else return j;
 +	}
 +	return next->match(str, matcher, m);
  }
  // NFAPossessiveQuantifierUNode
  NFAPossessiveQuantifierUNode::NFAPossessiveQuantifierUNode(WCPattern * pat, NFAUNode * internal, const int minMatch, const int maxMatch)
 -                            : NFAQuantifierUNode(pat, internal, minMatch, maxMatch) { }
 -int NFAPossessiveQuantifierUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +: NFAQuantifierUNode(pat, internal, minMatch, maxMatch) { }
 +int NFAPossessiveQuantifierUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int i, j, m = NFAQuantifierUNode::match(str, matcher, curInd);
 +	int i, j, m = NFAQuantifierUNode::match(str, matcher, curInd);
 -  if (m == -1) return -1;
 -  for (i = min; i < max; ++i)
 -  {
 -    j = inner->match(str, matcher, m);
 -    if (j <= m) return next->match(str, matcher, m);
 -    m = j;
 -  }
 -  return next->match(str, matcher, m);
 +	if (m == -1) return -1;
 +	for (i = min; i < max; ++i)
 +	{
 +		j = inner->match(str, matcher, m);
 +		if (j <= m) return next->match(str, matcher, m);
 +		m = j;
 +	}
 +	return next->match(str, matcher, m);
  }
  // NFAAcceptUNode
  NFAAcceptUNode::NFAAcceptUNode() { }
 -int NFAAcceptUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAAcceptUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (!next) return curInd;
 -  else return next->match(str, matcher, curInd);
 +	if (!next) return curInd;
 +	else return next->match(str, matcher, curInd);
  }
  // NFAClassUNode
  NFAClassUNode::NFAClassUNode(const bool invert)
  {
 -  inv = invert;
 +	inv = invert;
  }
 -NFAClassUNode::NFAClassUNode(const bkstring & clazz, const bool invert)
 +NFAClassUNode::NFAClassUNode(const CMString & clazz, const bool invert)
  {
 -  inv = invert;
 -  for (int i = 0; i < (int)clazz.size(); ++i) vals[clazz[i]] = 1;
 +	inv = invert;
 +	for (int i = 0; i < clazz.GetLength(); ++i)
 +		vals[clazz[i]] = 1;
  }
 -int NFAClassUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAClassUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd < (int)str.size() && ((vals.find(str[curInd]) != vals.end()) ^ inv))
 -  {
 -    return next->match(str, matcher, curInd + 1);
 -  }
 -  return -1;
 +	if (curInd < str.GetLength() && ((vals.find(str[curInd]) != vals.end()) ^ inv))
 +	{
 +		return next->match(str, matcher, curInd + 1);
 +	}
 +	return -1;
  }
  // NFACIClassUNode
  NFACIClassUNode::NFACIClassUNode(const bool invert)
  {
 -  inv = invert;
 +	inv = invert;
  }
 -NFACIClassUNode::NFACIClassUNode(const bkstring & clazz, const bool invert)
 +
 +NFACIClassUNode::NFACIClassUNode(const CMString & clazz, const bool invert)
  {
 -  inv = invert;
 -  for (int i = 0; i < (int)clazz.size(); ++i) vals[to_lower(clazz[i])] = 1;
 +	inv = invert;
 +	for (int i = 0; i < (int)clazz.GetLength(); ++i)
 +		vals[to_lower(clazz[i])] = 1;
  }
 -int NFACIClassUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +
 +int NFACIClassUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd < (int)str.size() && ((vals.find(to_lower(str[curInd])) != vals.end()) ^ inv))
 -  {
 -    return next->match(str, matcher, curInd + 1);
 -  }
 -  return -1;
 +	if (curInd < str.GetLength() && ((vals.find(to_lower(str[curInd])) != vals.end()) ^ inv))
 +		return next->match(str, matcher, curInd + 1);
 +
 +	return -1;
  }
  // NFASubStartUNode
  NFASubStartUNode::NFASubStartUNode() { }
 -int NFASubStartUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFASubStartUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  return next->match(str, matcher, curInd);
 +	return next->match(str, matcher, curInd);
  }
  // NFAOrUNode
 @@ -1424,39 +1367,39 @@ int NFASubStartUNode::match(const bkstring & str, WCMatcher * matcher, const int  NFAOrUNode::NFAOrUNode(NFAUNode * first, NFAUNode * second) : one(first), two(second) { }
  void NFAOrUNode::findAllNodes(std::map<NFAUNode*, bool> & soFar)
  {
 -  if (one) one->findAllNodes(soFar);
 -  if (two) two->findAllNodes(soFar);
 -  NFAUNode::findAllNodes(soFar);
 +	if (one) one->findAllNodes(soFar);
 +	if (two) two->findAllNodes(soFar);
 +	NFAUNode::findAllNodes(soFar);
  }
 -int NFAOrUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAOrUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int ci = one->match(str, matcher, curInd);
 +	int ci = one->match(str, matcher, curInd);
 -  if (ci != -1) ci = next->match(str, matcher, ci);
 -  if (ci != -1) return ci;
 -  if (ci == -1) ci = two->match(str, matcher, curInd);
 -  if (ci != -1) ci = next->match(str, matcher, ci);
 -  return ci;
 +	if (ci != -1) ci = next->match(str, matcher, ci);
 +	if (ci != -1) return ci;
 +	if (ci == -1) ci = two->match(str, matcher, curInd);
 +	if (ci != -1) ci = next->match(str, matcher, ci);
 +	return ci;
  }
  // NFAQuoteUNode
 -NFAQuoteUNode::NFAQuoteUNode(const bkstring & quoted) : qStr(quoted) { }
 -int NFAQuoteUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +NFAQuoteUNode::NFAQuoteUNode(const CMString & quoted) : qStr(quoted) { }
 +int NFAQuoteUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd + qStr.size() > str.size())       return -1;
 -  if (str.substr(curInd, qStr.size()) != qStr) return -1;
 -  return next->match(str, matcher, curInd + (int)qStr.size());
 +	if (curInd + qStr.GetLength() > str.GetLength()) return -1;
 +	if (str.Mid(curInd, qStr.GetLength()) != qStr) return -1;
 +	return next->match(str, matcher, curInd + qStr.GetLength());
  }
  // NFACIQuoteUNode
 -NFACIQuoteUNode::NFACIQuoteUNode(const bkstring & quoted) : qStr(quoted) { }
 -int NFACIQuoteUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +NFACIQuoteUNode::NFACIQuoteUNode(const CMString & quoted) : qStr(quoted) { }
 +int NFACIQuoteUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd + qStr.size() > str.size()) return -1;
 -  if (str_icmp(str.substr(curInd, qStr.size()).c_str(),  qStr.c_str())) return -1;
 -  return next->match(str, matcher, (int)qStr.size());
 +	if (curInd + qStr.GetLength() > str.GetLength()) return -1;
 +	if (str_icmp(str.Mid(curInd, qStr.GetLength()).c_str(), qStr.c_str())) return -1;
 +	return next->match(str, matcher, qStr.GetLength());
  }
  // NFALookAheadUNode
 @@ -1464,267 +1407,268 @@ int NFACIQuoteUNode::match(const bkstring & str, WCMatcher * matcher, const int  NFALookAheadUNode::NFALookAheadUNode(NFAUNode * internal, const bool positive) : NFAUNode(), pos(positive), inner(internal) { }
  void NFALookAheadUNode::findAllNodes(std::map<NFAUNode*, bool> & soFar)
  {
 -  if (inner) inner->findAllNodes(soFar);
 -  NFAUNode::findAllNodes(soFar);
 +	if (inner) inner->findAllNodes(soFar);
 +	NFAUNode::findAllNodes(soFar);
  }
 -int NFALookAheadUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFALookAheadUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  return ((inner->match(str, matcher, curInd) == -1) ^ pos) ? next->match(str, matcher, curInd) : -1;
 +	return ((inner->match(str, matcher, curInd) == -1) ^ pos) ? next->match(str, matcher, curInd) : -1;
  }
  // NFALookBehindUNode
 -NFALookBehindUNode::NFALookBehindUNode(const bkstring & str, const bool positive) : pos(positive), mStr(str) { }
 -int NFALookBehindUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  if (pos)
 -  {
 -    if (curInd < (int)mStr.size()) return -1;
 -    if (str.substr(curInd - mStr.size(), mStr.size()) == mStr) return next->match(str, matcher, curInd);
 -  }
 -  else
 -  {
 -    if (curInd < (int)mStr.size()) return next->match(str, matcher, curInd);
 -    if (str.substr(curInd - mStr.size(), mStr.size()) == mStr) return -1;
 -     return next->match(str, matcher, curInd);
 -  }
 -  return -1;
 +NFALookBehindUNode::NFALookBehindUNode(const CMString & str, const bool positive) : pos(positive), mStr(str) { }
 +int NFALookBehindUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	if (pos) {
 +		if (curInd < mStr.GetLength())
 +			return -1;
 +		if (str.Mid(curInd - mStr.GetLength(), mStr.GetLength()) == mStr)
 +			return next->match(str, matcher, curInd);
 +	}
 +	else {
 +		if (curInd < mStr.GetLength())
 +			return next->match(str, matcher, curInd);
 +		if (str.Mid(curInd - mStr.GetLength(), mStr.GetLength()) == mStr)
 +			return -1;
 +		return next->match(str, matcher, curInd);
 +	}
 +	return -1;
  }
  // NFAStartOfLineUNode
  NFAStartOfLineUNode::NFAStartOfLineUNode() { }
 -int NFAStartOfLineUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAStartOfLineUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd == 0 || str[curInd - 1] == (wchar_t)'\n' || str[curInd - 1] == (wchar_t)'\r')
 -  {
 -    return next->match(str, matcher, curInd);
 -  }
 -  return -1;
 +	if (curInd == 0 || str[curInd - 1] == '\n' || str[curInd - 1] == '\r')
 +	{
 +		return next->match(str, matcher, curInd);
 +	}
 +	return -1;
  }
  // NFAEndOfLineUNode
  NFAEndOfLineUNode::NFAEndOfLineUNode() { }
 -int NFAEndOfLineUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAEndOfLineUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd >= (int)str.size() || str[curInd] == (wchar_t)'\n' || str[curInd] == (wchar_t)'\r')
 -  {
 -    return next->match(str, matcher, curInd);
 -  }
 -  return -1;
 +	if (curInd >= str.GetLength() || str[curInd] == '\n' || str[curInd] == '\r')
 +		return next->match(str, matcher, curInd);
 +
 +	return -1;
  }
  // NFAReferenceUNode
  NFAReferenceUNode::NFAReferenceUNode(const int groupIndex) : gi(groupIndex) { }
 -int NFAReferenceUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAReferenceUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int len = matcher->ends[gi] - matcher->starts[gi];
 -  int ni = -1;
 -  if      (gi < 1 || matcher->ends[gi] < matcher->starts[gi] || len == 0)             ni = curInd;
 -  else if (curInd + len > (int)str.size())                                            return -1;
 -  else if (str.substr(curInd, len) != str.substr(matcher->starts[gi], len))  return -1;
 -  else                                                                                ni = curInd + len;
 +	int len = matcher->ends[gi] - matcher->starts[gi];
 +	int ni = -1;
 +	if (gi < 1 || matcher->ends[gi] < matcher->starts[gi] || len == 0)   ni = curInd;
 +	else if (curInd + len > (int)str.GetLength())                        return -1;
 +	else if (str.Mid(curInd, len) != str.Mid(matcher->starts[gi], len))  return -1;
 +	else                                                                 ni = curInd + len;
 -  return next->match(str, matcher, ni);
 +	return next->match(str, matcher, ni);
  }
  // NFAStartOfInputUNode
  NFAStartOfInputUNode::NFAStartOfInputUNode() { }
 -int NFAStartOfInputUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAStartOfInputUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd == 0) return next->match(str, matcher, curInd);
 -  return -1;
 +	if (curInd == 0) return next->match(str, matcher, curInd);
 +	return -1;
  }
  // NFAEndOfInputUNode
  NFAEndOfInputUNode::NFAEndOfInputUNode(const bool lookForTerm) : term(lookForTerm) { }
 -int NFAEndOfInputUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  int len = (int)str.size();
 -  if      (curInd == len) return next->match(str, matcher, curInd);
 -  else if (term)
 -  {
 -    if      (curInd == len - 1 && (str[curInd] == (wchar_t)'\r' || str[curInd] == (wchar_t)'\n'))
 -    {
 -      return next->match(str, matcher, curInd);
 -    }
 -    else if (curInd == len - 2 && str.substr(curInd, 2) == L"\r\n")
 -    {
 -      return next->match(str, matcher, curInd);
 -    }
 -  }
 -  return -1;
 +int NFAEndOfInputUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	int len = str.GetLength();
 +	if (curInd == len) return next->match(str, matcher, curInd);
 +	else if (term)
 +	{
 +		if (curInd == len - 1 && (str[curInd] == '\r' || str[curInd] == '\n'))
 +		{
 +			return next->match(str, matcher, curInd);
 +		}
 +		else if (curInd == len - 2 && str.Mid(curInd, 2) == L"\r\n")
 +		{
 +			return next->match(str, matcher, curInd);
 +		}
 +	}
 +	return -1;
  }
  // NFAWordBoundaryUNode
  NFAWordBoundaryUNode::NFAWordBoundaryUNode(const bool positive) : pos(positive) { }
 -int NFAWordBoundaryUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAWordBoundaryUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int len = (int)str.size();
 +	int len = str.GetLength();
 -  wchar_t c1 = (curInd - 1 < len && curInd > 0) ? str[curInd - 1] : '\n';
 -  wchar_t c2 = (curInd     < len) ? str[curInd    ] : '\n';
 +	wchar_t c1 = (curInd - 1 < len && curInd > 0) ? str[curInd - 1] : '\n';
 +	wchar_t c2 = (curInd < len) ? str[curInd] : '\n';
 -  if      (curInd == len) return next->match(str, matcher, curInd);
 -  bool ok = is_alpha(c1) != is_alpha(c2);
 -  if (ok && pos) return next->match(str, matcher, curInd);
 -  return -1;
 +	if (curInd == len) return next->match(str, matcher, curInd);
 +	bool ok = is_alpha(c1) != is_alpha(c2);
 +	if (ok && pos) return next->match(str, matcher, curInd);
 +	return -1;
  }
  // NFAEndOfMatchUNode
  NFAEndOfMatchUNode::NFAEndOfMatchUNode() { }
 -int NFAEndOfMatchUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAEndOfMatchUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  if (curInd == matcher->lm) return next->match(str, matcher, curInd);
 -  return -1;
 +	if (curInd == matcher->lm) return next->match(str, matcher, curInd);
 +	return -1;
  }
  // NFAGroupHeadUNode
  NFAGroupHeadUNode::NFAGroupHeadUNode(const int groupIndex) : gi(groupIndex) { }
 -int NFAGroupHeadUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAGroupHeadUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int ret, o = matcher->starts[gi];
 +	int ret, o = matcher->starts[gi];
 -  matcher->starts[gi] = curInd;
 -  ret = next->match(str, matcher, curInd);
 -  if (ret < 0) matcher->starts[gi] = o;
 +	matcher->starts[gi] = curInd;
 +	ret = next->match(str, matcher, curInd);
 +	if (ret < 0) matcher->starts[gi] = o;
 -  return ret;
 +	return ret;
  }
  // NFAGroupTailUNode
  NFAGroupTailUNode::NFAGroupTailUNode(const int groupIndex) : gi(groupIndex) { }
 -int NFAGroupTailUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAGroupTailUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int ret, o = matcher->ends[gi];
 +	int ret, o = matcher->ends[gi];
 -  matcher->ends[gi] = curInd;
 -  ret = next->match(str, matcher, curInd);
 -  if (ret < 0) matcher->ends[gi] = o;
 +	matcher->ends[gi] = curInd;
 +	ret = next->match(str, matcher, curInd);
 +	if (ret < 0) matcher->ends[gi] = o;
 -  return ret;
 +	return ret;
  }
  // NFAGroupLoopPrologueUNode
  NFAGroupLoopPrologueUNode::NFAGroupLoopPrologueUNode(const int groupIndex) : gi(groupIndex) { }
 -int NFAGroupLoopPrologueUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 +int NFAGroupLoopPrologueUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
  {
 -  int ret, o1 = matcher->groups[gi], o2 = matcher->groupPos[gi], o3 = matcher->groupIndeces[gi];
 +	int ret, o1 = matcher->groups[gi], o2 = matcher->groupPos[gi], o3 = matcher->groupIndeces[gi];
 -  matcher->groups[gi] = 0;
 -  matcher->groupPos[gi] = 0;
 -  matcher->groupIndeces[gi] = -1;
 -  ret = next->match(str, matcher, curInd);
 -  if (ret < 0)
 -  {
 -    matcher->groups[gi] = o1;
 -    matcher->groupPos[gi] = o2;
 -    matcher->groupIndeces[gi] = o3;
 -  }
 +	matcher->groups[gi] = 0;
 +	matcher->groupPos[gi] = 0;
 +	matcher->groupIndeces[gi] = -1;
 +	ret = next->match(str, matcher, curInd);
 +	if (ret < 0)
 +	{
 +		matcher->groups[gi] = o1;
 +		matcher->groupPos[gi] = o2;
 +		matcher->groupIndeces[gi] = o3;
 +	}
 -  return ret;
 +	return ret;
  }
  // NFAGroupLoopUNode
  NFAGroupLoopUNode::NFAGroupLoopUNode(NFAUNode * internal, const int minMatch, const int maxMatch,
 -                                   const int groupIndex, const int matchType)
 +	const int groupIndex, const int matchType)
  {
 -  inner = internal;
 -  min = minMatch;
 -  max = maxMatch;
 -  gi = groupIndex;
 -  type = matchType;
 +	inner = internal;
 +	min = minMatch;
 +	max = maxMatch;
 +	gi = groupIndex;
 +	type = matchType;
  }
  void NFAGroupLoopUNode::findAllNodes(std::map<NFAUNode*, bool> & soFar)
  {
 -  if (inner) inner->findAllNodes(soFar);
 -  NFAUNode::findAllNodes(soFar);
 -}
 -int NFAGroupLoopUNode::match(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  bool b = (curInd > matcher->groupIndeces[gi]);
 -
 -  if (b && matcher->groups[gi] < min)
 -  {
 -    ++matcher->groups[gi];
 -    int o = matcher->groupIndeces[gi];
 -    matcher->groupIndeces[gi] = curInd;
 -    int ret = inner->match(str, matcher, curInd);
 -    if (ret < 0)
 -    {
 -      matcher->groupIndeces[gi] = o;
 -      --matcher->groups[gi];
 -    }
 -    return ret;
 -  }
 -  else if (!b || matcher->groups[gi] >= max)
 -  {
 -    return next->match(str, matcher, curInd);
 -  }
 -  else
 -  {
 -    switch (type)
 -    {
 -    case 0: return matchGreedy(str, matcher, curInd);
 -    case 1: return matchLazy(str, matcher, curInd);
 -    case 2: return matchPossessive(str, matcher, curInd);
 -    }
 -  }
 -  return -1;
 -}
 -int NFAGroupLoopUNode::matchGreedy(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  int o = matcher->groupIndeces[gi];            // save our info for backtracking
 -  matcher->groupIndeces[gi] = curInd;           // move along
 -  ++matcher->groups[gi];
 -  int ret = inner->match(str, matcher, curInd); // match internally
 -  if (ret < 0)
 -  {                                             // if we failed, then restore info and match next
 -    --matcher->groups[gi];
 -    matcher->groupIndeces[gi] = o;
 -    ret = next->match(str, matcher, curInd);
 -  }
 -  return ret;
 -}
 -int NFAGroupLoopUNode::matchLazy(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  int ret = next->match(str, matcher, curInd);  // be lazy, just go on
 -  if (ret < 0)
 -  {
 -    int o = matcher->groupIndeces[gi];          // save info for backtracking
 -    matcher->groupIndeces[gi] = curInd;         // advance our position
 -    ++matcher->groups[gi];
 -    ret = inner->match(str, matcher, curInd);   // match our internal stuff
 -    if (ret < 0)                                // if we failed, then restore the info
 -    {
 -      --matcher->groups[gi];
 -      matcher->groupIndeces[gi] = o;
 -    }
 -  }
 -  return ret;
 -}
 -int NFAGroupLoopUNode::matchPossessive(const bkstring & str, WCMatcher * matcher, const int curInd) const
 -{
 -  int o = matcher->groupIndeces[gi];            // save info for backtracking
 -  matcher->groupPos[gi] = matcher->groups[gi];  // set a flag stating we have matcher at least this much
 -  matcher->groupIndeces[gi] = curInd;           // move along
 -  ++matcher->groups[gi];
 -  int ret = inner->match(str, matcher, curInd); // try and match again
 -  if (ret < 0)
 -  {                                             // if we fail, back off, but to an extent
 -    --matcher->groups[gi];
 -    matcher->groupIndeces[gi] = o;
 -    if (matcher->groups[gi] == matcher->groupPos[gi]) ret = next->match(str, matcher, curInd);
 -  }
 -  return ret;
 -}
\ No newline at end of file +	if (inner) inner->findAllNodes(soFar);
 +	NFAUNode::findAllNodes(soFar);
 +}
 +int NFAGroupLoopUNode::match(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	bool b = (curInd > matcher->groupIndeces[gi]);
 +
 +	if (b && matcher->groups[gi] < min)
 +	{
 +		++matcher->groups[gi];
 +		int o = matcher->groupIndeces[gi];
 +		matcher->groupIndeces[gi] = curInd;
 +		int ret = inner->match(str, matcher, curInd);
 +		if (ret < 0)
 +		{
 +			matcher->groupIndeces[gi] = o;
 +			--matcher->groups[gi];
 +		}
 +		return ret;
 +	}
 +	else if (!b || matcher->groups[gi] >= max)
 +	{
 +		return next->match(str, matcher, curInd);
 +	}
 +	else
 +	{
 +		switch (type)
 +		{
 +		case 0: return matchGreedy(str, matcher, curInd);
 +		case 1: return matchLazy(str, matcher, curInd);
 +		case 2: return matchPossessive(str, matcher, curInd);
 +		}
 +	}
 +	return -1;
 +}
 +int NFAGroupLoopUNode::matchGreedy(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	int o = matcher->groupIndeces[gi];            // save our info for backtracking
 +	matcher->groupIndeces[gi] = curInd;           // move along
 +	++matcher->groups[gi];
 +	int ret = inner->match(str, matcher, curInd); // match internally
 +	if (ret < 0)
 +	{                                             // if we failed, then restore info and match next
 +		--matcher->groups[gi];
 +		matcher->groupIndeces[gi] = o;
 +		ret = next->match(str, matcher, curInd);
 +	}
 +	return ret;
 +}
 +int NFAGroupLoopUNode::matchLazy(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	int ret = next->match(str, matcher, curInd);  // be lazy, just go on
 +	if (ret < 0)
 +	{
 +		int o = matcher->groupIndeces[gi];          // save info for backtracking
 +		matcher->groupIndeces[gi] = curInd;         // advance our position
 +		++matcher->groups[gi];
 +		ret = inner->match(str, matcher, curInd);   // match our internal stuff
 +		if (ret < 0)                                // if we failed, then restore the info
 +		{
 +			--matcher->groups[gi];
 +			matcher->groupIndeces[gi] = o;
 +		}
 +	}
 +	return ret;
 +}
 +int NFAGroupLoopUNode::matchPossessive(const CMString & str, WCMatcher * matcher, const int curInd) const
 +{
 +	int o = matcher->groupIndeces[gi];            // save info for backtracking
 +	matcher->groupPos[gi] = matcher->groups[gi];  // set a flag stating we have matcher at least this much
 +	matcher->groupIndeces[gi] = curInd;           // move along
 +	++matcher->groups[gi];
 +	int ret = inner->match(str, matcher, curInd); // try and match again
 +	if (ret < 0)
 +	{                                             // if we fail, back off, but to an extent
 +		--matcher->groups[gi];
 +		matcher->groupIndeces[gi] = o;
 +		if (matcher->groups[gi] == matcher->groupPos[gi]) ret = next->match(str, matcher, curInd);
 +	}
 +	return ret;
 +}
 diff --git a/plugins/SmileyAdd/src/regexp/WCPattern.h b/plugins/SmileyAdd/src/regexp/WCPattern.h index 143eff7eb7..e3455e8b31 100644 --- a/plugins/SmileyAdd/src/regexp/WCPattern.h +++ b/plugins/SmileyAdd/src/regexp/WCPattern.h @@ -771,7 +771,7 @@ class NFAQuantifierUNode;     <h4> Backslashes, escapes, and quoting </h4>
 -   <p> The backslash character (<tt>(wchar_t)'\'</tt>) serves to introduce escaped
 +   <p> The backslash character (<tt>'\'</tt>) serves to introduce escaped
     constructs, as defined in the table above, as well as to quote characters
     that otherwise would be interpreted as unescaped constructs.  Thus the
     expression <tt>\\</tt> matches a single backslash and <tt>\{</tt> matches a
 @@ -963,691 +963,691 @@ class NFAQuantifierUNode;   */
  class WCPattern
  {
 -  friend class WCMatcher;
 -  friend class NFAUNode;
 -  friend class NFAQuantifierUNode;
 -  private:
 -    /**
 -      This constructor should not be called directly. Those wishing to use the
 -      WCPattern class should instead use the {@link compile compile} method.
 -
 -      @param rhs The pattern to compile
 -      @memo Creates a new pattern from the regular expression in <code>rhs</code>.
 -     */
 -    WCPattern(const bkstring & rhs);
 -  protected:
 -    /**
 -      This currently is not used, so don't try to do anything with it.
 -      @memo Holds all the compiled patterns for quick access.
 -     */
 -    static std::map<bkstring, WCPattern *> compiledWCPatterns;
 -    /**
 -      Holds all of the registered patterns as strings. Due to certain problems
 -      with compilation of patterns, especially with capturing groups, this seemed
 -      to be the best way to do it.
 -     */
 -    static std::map<bkstring, std::pair<bkstring, unsigned long> > registeredWCPatterns;
 -  protected:
 -    /**
 -      Holds all the NFA nodes used. This makes deletion of a pattern, as well as
 -      clean-up from an unsuccessful compile much easier and faster.
 -     */
 -    std::map<NFAUNode*, bool> nodes;
 -    /**
 -      Used when methods like split are called. The matcher class uses a lot of
 -      dynamic memeory, so having an instance increases speedup of certain
 -      operations.
 -     */
 -    WCMatcher * matcher;
 -    /**
 -      The front node of the NFA.
 -     */
 -    NFAUNode * head;
 -    /**
 -      The actual regular expression we rerpesent
 -      */
 -    bkstring pattern;
 -    /**
 -      Flag used during compilation. Once the pattern is successfully compiled,
 -      <code>error</code> is no longer used.
 -     */
 -    bool error;
 -    /**
 -      Used during compilation to keep track of the current index into
 -      <code>{@link pattern pattern}<code>.  Once the pattern is successfully
 -      compiled, <code>error</code> is no longer used.
 -     */
 -    int curInd;
 -    /**
 -      The number of capture groups this contains.
 -     */
 -    int groupCount;
 -    /**
 -      The number of non-capture groups this contains.
 -     */
 -    int nonCapGroupCount;
 -    /**
 -      The flags specified when this was compiled.
 -     */
 -    unsigned long flags;
 -  protected:
 -    /**
 -      Raises an error during compilation. Compilation will cease at that point
 -      and compile will return <code>NULL</code>.
 -     */
 -    void raiseError();
 -    /**
 -      Convenience function for registering a node in <code>nodes</code>.
 -      @param node The node to register
 -      @return The registered node
 -     */
 -    NFAUNode * registerNode(NFAUNode * node);
 -
 -    /**
 -      Calculates the union of two strings. This function will first sort the
 -      strings and then use a simple selection algorithm to find the union.
 -      @param s1 The first "class" to union
 -      @param s2 The second "class" to union
 -      @return A new string containing all unique characters. Each character
 -              must have appeared in one or both of <code>s1</code> and
 -              <code>s2</code>.
 -     */
 -    bkstring classUnion      (bkstring s1, bkstring s2)  const;
 -    /**
 -      Calculates the intersection of two strings. This function will first sort
 -      the strings and then use a simple selection algorithm to find the
 -      intersection.
 -      @param s1 The first "class" to intersect
 -      @param s2 The second "class" to intersect
 -      @return A new string containing all unique characters. Each character
 -              must have appeared both <code>s1</code> and <code>s2</code>.
 -     */
 -    bkstring classIntersect  (bkstring s1, bkstring s2)  const;
 -    /**
 -      Calculates the negation of a string. The negation is the set of all
 -      characters between <code>\x00</code> and <code>\xFF</code> not
 -      contained in <code>s1</code>.
 -      @param s1 The "class" to be negated.
 -      @param s2 The second "class" to intersect
 -      @return A new string containing all unique characters. Each character
 -              must have appeared both <code>s1</code> and <code>s2</code>.
 -     */
 -    bkstring classNegate     (bkstring s1)                  const;
 -    /**
 -      Creates a new "class" representing the range from <code>low</code> thru
 -      <code>hi</code>. This function will wrap if <code>low</code> >
 -      <code>hi</code>. This is a feature, not a buf. Sometimes it is useful
 -      to be able to say [\x70-\x10] instead of [\x70-\x7F\x00-\x10].
 -      @param low The beginning character
 -      @param hi  The ending character
 -      @return A new string containing all the characters from low thru hi.
 -     */
 -    bkstring classCreateRange(wchar_t low,       wchar_t hi)         const;
 -
 -    /**
 -      Extracts a decimal number from the substring of member-variable
 -      <code>{@link pattern pattern}<code> starting at <code>start</code> and
 -      ending at <code>end</code>.
 -      @param start The starting index in <code>{@link pattern pattern}<code>
 -      @param end The last index in <code>{@link pattern pattern}<code>
 -      @return The decimal number in <code>{@link pattern pattern}<code>
 -     */
 -    int getInt(int start, int end);
 -    /**
 -      Parses a <code>{n,m}</code> string out of the member-variable
 -      <code>{@link pattern pattern}<code> stores the result in <code>sNum</code>
 -      and <code>eNum</code>.
 -      @param sNum Output parameter. The minimum number of matches required
 -                  by the curly quantifier are stored here.
 -      @param eNum Output parameter. The maximum number of matches allowed
 -                  by the curly quantifier are stored here.
 -      @return Success/Failure. Fails when the curly does not have the proper
 -              syntax
 -     */
 -    bool quantifyCurly(int & sNum, int & eNum);
 -    /**
 -      Tries to quantify the currently parsed group. If the group being parsed
 -      is indeed quantified in the member-variable
 -      <code>{@link pattern pattern}<code>, then the NFA is modified accordingly.
 -      @param start  The starting node of the current group being parsed
 -      @param stop   The ending node of the current group being parsed
 -      @param gn     The group number of the current group being parsed
 -      @return       The node representing the starting node of the group. If the
 -                    group becomes quantified, then this node is not necessarily
 -                    a GroupHead node.
 -     */
 -    NFAUNode * quantifyGroup(NFAUNode * start, NFAUNode * stop, const int gn);
 -
 -    /**
 -      Tries to quantify the last parsed expression. If the character was indeed
 -      quantified, then the NFA is modified accordingly.
 -      @param newNode The recently created expression node
 -      @return The node representing the last parsed expression. If the
 -              expression was quantified, <code>return value != newNode</code>
 -     */
 -    NFAUNode * quantify(NFAUNode * newNode);
 -    /**
 -      Parses the current class being examined in
 -      <code>{@link pattern pattern}</code>.
 -      @return A string of unique characters contained in the current class being
 -              parsed
 -     */
 -    bkstring parseClass();
 -    /**
 -      Parses the current POSIX class being examined in
 -      <code>{@link pattern pattern}</code>.
 -      @return A string of unique characters representing the POSIX class being
 -              parsed
 -     */
 -    bkstring parsePosix();
 -    /**
 -      Returns a string containing the octal character being parsed
 -      @return The string contained the octal value being parsed
 -     */
 -    bkstring parseOctal();
 -    /**
 -      Returns a string containing the hex character being parsed
 -      @return The string contained the hex value being parsed
 -     */
 -    bkstring parseHex();
 -    /**
 -      Returns a new node representing the back reference being parsed
 -      @return The new node representing the back reference being parsed
 -     */
 -    NFAUNode *   parseBackref();
 -    /**
 -      Parses the escape sequence currently being examined. Determines if the
 -      escape sequence is a class, a single character, or the beginning of a
 -      quotation sequence.
 -      @param inv Output parameter. Whether or not to invert the returned class
 -      @param quo Output parameter. Whether or not this sequence starts a
 -                 quotation.
 -      @return The characters represented by the class
 -     */
 -    bkstring parseEscape(bool & inv, bool & quo);
 -    /**
 -      Parses a supposed registered pattern currently under compilation. If the
 -      sequence of characters does point to a registered pattern, then the
 -      registered pattern is appended to <code>*end<code>. The registered pattern
 -      is parsed with the current compilation flags.
 -      @param end The ending node of the thus-far compiled pattern
 -      @return The new end node of the current pattern
 -     */
 -    NFAUNode * parseRegisteredWCPattern(NFAUNode ** end);
 -    /**
 -      Parses a lookbehind expression. Appends the necessary nodes
 -      <code>*end</code>.
 -      @param pos Positive or negative look behind
 -      @param end The ending node of the current pattern
 -      @return The new end node of the current pattern
 -     */
 -    NFAUNode * parseBehind(const bool pos, NFAUNode ** end);
 -    /**
 -      Parses the current expression and tacks on nodes until a \E is found.
 -      @return The end of the current pattern
 -     */
 -    NFAUNode * parseQuote();
 -    /**
 -      Parses <code>{@link pattern pattern}</code>. This function is called
 -      recursively when an or (<code>|</code>) or a group is encountered.
 -      @param inParen Are we currently parsing inside a group
 -      @param inOr Are we currently parsing one side of an or (<code>|</code>)
 -      @param end The end of the current expression
 -      @return The starting node of the NFA constructed from this parse
 -     */
 -    NFAUNode * parse(const bool inParen = 0, const bool inOr = 0, NFAUNode ** end = NULL);
 -  public:
 -    /// We should match regardless of case
 -    const static unsigned long CASE_INSENSITIVE;
 -    /// We are implicitly quoted
 -    const static unsigned long LITERAL;
 -    /// @memo We should treat a <code><b>.</b></code> as [\x00-\x7F]
 -    const static unsigned long DOT_MATCHES_ALL;
 -    /** <code>^</code> and <code>$</code> should anchor to the beginning and
 -        ending of lines, not all input
 -     */
 -    const static unsigned long MULTILINE_MATCHING;
 -    /** When enabled, only instances of <code>\n</codes> are recognized as
 -        line terminators
 -     */
 -    const static unsigned long UNIX_LINE_MODE;
 -    /// The absolute minimum number of matches a quantifier can match (0)
 -    const static int MIN_QMATCH;
 -    /// The absolute maximum number of matches a quantifier can match (0x7FFFFFFF)
 -    const static int MAX_QMATCH;
 -  public:
 -    /**
 -      Call this function to compile a regular expression into a
 -      <code>WCPattern</code> object. Special values can be assigned to
 -      <code>mode</code> when certain non-standard behaviors are expected from
 -      the <code>WCPattern</code> object.
 -      @param pattern The regular expression to compile
 -      @param mode    A bitwise or of flags signalling what special behaviors are
 -                     wanted from this <code>WCPattern</code> object
 -      @return If successful, <code>compile</code> returns a <code>WCPattern</code>
 -              pointer. Upon failure, <code>compile</code> returns
 -              <code>NULL</code>
 -     */
 -    static WCPattern                    * compile        (const bkstring & pattern,
 -                                                        const unsigned long mode = 0);
 -    /**
 -      Dont use this function. This function will compile a pattern, and cache
 -      the result. This will eventually be used as an optimization when people
 -      just want to call static methods using the same pattern over and over
 -      instead of first compiling the pattern and then using the compiled
 -      instance for matching.
 -      @param pattern The regular expression to compile
 -      @param mode    A bitwise or of flags signalling what special behaviors are
 -                     wanted from this <code>WCPattern</code> object
 -      @return If successful, <code>compileAndKeep</code> returns a
 -              <code>WCPattern</code> pointer. Upon failure, <code>compile</code>
 -              returns <code>NULL</code>.
 -     */
 -    static WCPattern                    * compileAndKeep (const bkstring & pattern,
 -                                                        const unsigned long mode = 0);
 -
 -    /**
 -      Searches through <code>replace</code> and replaces all substrings matched
 -      by <code>pattern</code> with <code>str</code>. <code>str</code> may
 -      contain backreferences (e.g. <code>\1</code>) to capture groups. A typical
 -      invocation looks like:
 -      <p>
 -      <code>
 -      WCPattern::replace(L"(a+)b(c+)", L"abcccbbabcbabc", L"\\2b\\1");
 -      </code>
 -      <p>
 -      which would replace <code>abcccbbabcbabc</code> with
 -      <code>cccbabbcbabcba</code>.
 -      @param pattern          The regular expression
 -      @param str              The replacement text
 -      @param replacementText  The string in which to perform replacements
 -      @param mode             The special mode requested of the <code>WCPattern</code>
 -                              during the replacement process
 -      @return The text with the replacement string substituted where necessary
 -     */
 -    static bkstring                  replace       (const bkstring & pattern,
 -                                                        const bkstring & str,
 -                                                        const bkstring & replacementText,
 -                                                        const unsigned long mode = 0);
 -
 -    /**
 -      Splits the specified string over occurrences of the specified pattern.
 -      Empty strings can be optionally ignored. The number of strings returned is
 -      configurable. A typical invocation looks like:
 -      <p>
 -      <code>
 -      bkstring str(strSize, 0);<br>
 -      FILE * fp = fopen(fileName, "r");<br>
 -      fread((char*)str.data(), strSize * 2, 1, fp);<br>
 -      fclose(fp);<br>
 -      <br>
 -      std::vector<bkstring> lines = WCPattern::split(L"[\r\n]+", str, true);<br>
 -      <br>
 -      </code>
 -
 -      @param pattern    The regular expression
 -      @param replace    The string to split
 -      @param keepEmptys Whether or not to keep empty strings
 -      @param limit      The maximum number of splits to make
 -      @param mode       The special mode requested of the <code>WCPattern</code>
 -                        during the split process
 -      @return All substrings of <code>str</code> split across <code>pattern</code>.
 -     */
 -    static std::vector<bkstring>     split         (const bkstring & pattern,
 -                                                        const bkstring & str,
 -                                                        const bool keepEmptys = 0,
 -                                                        const unsigned long limit = 0,
 -                                                        const unsigned long mode = 0);
 -
 -    /**
 -      Finds all the instances of the specified pattern within the string. You
 -      should be careful to only pass patterns with a minimum length of one. For
 -      example, the pattern <code>a*</code> can be matched by an empty string, so
 -      instead you should pass <code>a+</code> since at least one character must
 -      be matched. A typical invocation of <code>findAll</code> looks like:
 -      <p>
 -      <code>
 -      std::vector<td::string> numbers = WCPattern::findAll(L"\\d+", string);
 -      </code>
 -      <p>
 -
 -      @param pattern  The pattern for which to search
 -      @param str      The string to search
 -      @param mode     The special mode requested of the <code>WCPattern</code>
 -                      during the find process
 -      @return All instances of <code>pattern</code> in <code>str</code>
 -     */
 -    static std::vector<bkstring>     findAll       (const bkstring & pattern,
 -                                                        const bkstring & str,
 -                                                        const unsigned long mode = 0);
 -
 -    /**
 -      Determines if an entire string matches the specified pattern
 -
 -      @param pattern  The pattern for to match
 -      @param str      The string to match
 -      @param mode     The special mode requested of the <code>WCPattern</code>
 -                      during the replacement process
 -      @return True if <code>str</code> is recognized by <code>pattern</code>
 -     */
 -    static bool                         matches        (const bkstring & pattern,
 -                                                        const bkstring & str,
 -                                                        const unsigned long mode = 0);
 -
 -    /**
 -      Registers a pattern under a specific name for use in later compilations.
 -      A typical invocation and later use looks like:
 -      <p>
 -      <code>
 -      WCPattern::registerWCPattern(L"ip", L"(?:\\d{1,3}\\.){3}\\d{1,3}");<br>
 -      WCPattern * p1 = WCPattern::compile(L"{ip}:\\d+");<br>
 -      WCPattern * p2 = WCPattern::compile(L"Connection from ({ip}) on port \\d+");<br>
 -      </code>
 -      <p>
 -      Multiple calls to <code>registerWCPattern</code> with the same
 -      <code>name</code> will result in the pattern getting overwritten.
 -
 -      @param name     The name to give to the pattern
 -      @param pattern  The pattern to register
 -      @param mode     Any special flags to use when compiling pattern
 -      @return Success/Failure. Fails only if <code>pattern</code> has invalid
 -              syntax
 -     */
 -    static bool                         registerWCPattern(const bkstring & name,
 -                                                        const bkstring & pattern,
 -                                                        const unsigned long mode = 0);
 -
 -    /**
 -      Clears the pattern registry
 -      */
 -    static void                         unregisterWCPatterns();
 -    /**
 -      Don't use
 -     */
 -    static void                         clearWCPatternCache();
 -
 -    /**
 -      Searches through a string for the <code>n<sup>th</sup></code> match of the
 -      given pattern in the string. Match indeces start at zero, not one.
 -      A typical invocation looks like this:
 -      <p>
 -      <code>
 -      std::pair<bkstring, int> match = WCPattern::findNthMatch(L"\\d{1,3}", L"192.168.1.101:22", 1);<br>
 -      wprintf(L"%s %i\n", match.first.c_str(), match.second);<br>
 -      <br>
 -      Output: 168 4<br>
 -      <br>
 -
 -      @param pattern  The pattern for which to search
 -      @param str      The string to search
 -      @param matchNum Which match to find
 -      @param mode     Any special flags to use during the matching process
 -      @return A string and an integer. The string is the string matched. The
 -              integer is the starting location of the matched string in
 -              <code>str</code>. You can check for success/failure by making sure
 -              that the integer returned is greater than or equal to zero.
 -     */
 -    static std::pair<bkstring, int>  findNthMatch   (const bkstring & pattern,
 -                                                        const bkstring & str,
 -                                                        const int matchNum,
 -                                                        const unsigned long mode = 0);
 -  public:
 -    /**
 -      Deletes all NFA nodes allocated during compilation
 -     */
 -    ~WCPattern();
 -
 -    bkstring               replace       (const bkstring & str,
 -                                              const bkstring & replacementText);
 -    std::vector<bkstring>  split         (const bkstring & str, const bool keepEmptys = 0,
 -                                              const unsigned long limit = 0);
 -    std::vector<bkstring>  findAll       (const bkstring & str);
 -    bool                       matches       (const bkstring & str);
 -    /**
 -      Returns the flags used during compilation of this pattern
 -      @return The flags used during compilation of this pattern
 -     */
 -    unsigned long             getFlags       () const;
 -    /**
 -      Returns the regular expression this pattern represents
 -      @return The regular expression this pattern represents
 -     */
 -    bkstring               getWCPattern     () const;
 -    /**
 -      Creates a matcher object using the specified string and this pattern.
 -      @param str The string to match against
 -      @return A new matcher using object using this pattern and the specified
 -              string
 -     */
 -    WCMatcher                 * createWCMatcher  (const bkstring & str);
 +	friend class WCMatcher;
 +	friend class NFAUNode;
 +	friend class NFAQuantifierUNode;
 +private:
 +	/**
 +	  This constructor should not be called directly. Those wishing to use the
 +	  WCPattern class should instead use the {@link compile compile} method.
 +
 +	  @param rhs The pattern to compile
 +	  @memo Creates a new pattern from the regular expression in <code>rhs</code>.
 +	  */
 +	WCPattern(const CMString & rhs);
 +protected:
 +	/**
 +	  This currently is not used, so don't try to do anything with it.
 +	  @memo Holds all the compiled patterns for quick access.
 +	  */
 +	static std::map<CMString, WCPattern *> compiledWCPatterns;
 +	/**
 +	  Holds all of the registered patterns as strings. Due to certain problems
 +	  with compilation of patterns, especially with capturing groups, this seemed
 +	  to be the best way to do it.
 +	  */
 +	static std::map<CMString, std::pair<CMString, unsigned long> > registeredWCPatterns;
 +protected:
 +	/**
 +	  Holds all the NFA nodes used. This makes deletion of a pattern, as well as
 +	  clean-up from an unsuccessful compile much easier and faster.
 +	  */
 +	std::map<NFAUNode*, bool> nodes;
 +	/**
 +	  Used when methods like split are called. The matcher class uses a lot of
 +	  dynamic memeory, so having an instance increases speedup of certain
 +	  operations.
 +	  */
 +	WCMatcher * matcher;
 +	/**
 +	  The front node of the NFA.
 +	  */
 +	NFAUNode * head;
 +	/**
 +	  The actual regular expression we rerpesent
 +	  */
 +	CMString pattern;
 +	/**
 +	  Flag used during compilation. Once the pattern is successfully compiled,
 +	  <code>error</code> is no longer used.
 +	  */
 +	bool error;
 +	/**
 +	  Used during compilation to keep track of the current index into
 +	  <code>{@link pattern pattern}<code>.  Once the pattern is successfully
 +	  compiled, <code>error</code> is no longer used.
 +	  */
 +	int curInd;
 +	/**
 +	  The number of capture groups this contains.
 +	  */
 +	int groupCount;
 +	/**
 +	  The number of non-capture groups this contains.
 +	  */
 +	int nonCapGroupCount;
 +	/**
 +	  The flags specified when this was compiled.
 +	  */
 +	unsigned long flags;
 +protected:
 +	/**
 +	  Raises an error during compilation. Compilation will cease at that point
 +	  and compile will return <code>NULL</code>.
 +	  */
 +	void raiseError();
 +	/**
 +	  Convenience function for registering a node in <code>nodes</code>.
 +	  @param node The node to register
 +	  @return The registered node
 +	  */
 +	NFAUNode * registerNode(NFAUNode * node);
 +
 +	/**
 +	  Calculates the union of two strings. This function will first sort the
 +	  strings and then use a simple selection algorithm to find the union.
 +	  @param s1 The first "class" to union
 +	  @param s2 The second "class" to union
 +	  @return A new string containing all unique characters. Each character
 +	  must have appeared in one or both of <code>s1</code> and
 +	  <code>s2</code>.
 +	  */
 +	CMString classUnion(CMString s1, CMString s2)  const;
 +	/**
 +	  Calculates the intersection of two strings. This function will first sort
 +	  the strings and then use a simple selection algorithm to find the
 +	  intersection.
 +	  @param s1 The first "class" to intersect
 +	  @param s2 The second "class" to intersect
 +	  @return A new string containing all unique characters. Each character
 +	  must have appeared both <code>s1</code> and <code>s2</code>.
 +	  */
 +	CMString classIntersect(CMString s1, CMString s2)  const;
 +	/**
 +	  Calculates the negation of a string. The negation is the set of all
 +	  characters between <code>\x00</code> and <code>\xFF</code> not
 +	  contained in <code>s1</code>.
 +	  @param s1 The "class" to be negated.
 +	  @param s2 The second "class" to intersect
 +	  @return A new string containing all unique characters. Each character
 +	  must have appeared both <code>s1</code> and <code>s2</code>.
 +	  */
 +	CMString classNegate(CMString s1)                  const;
 +	/**
 +	  Creates a new "class" representing the range from <code>low</code> thru
 +	  <code>hi</code>. This function will wrap if <code>low</code> >
 +	  <code>hi</code>. This is a feature, not a buf. Sometimes it is useful
 +	  to be able to say [\x70-\x10] instead of [\x70-\x7F\x00-\x10].
 +	  @param low The beginning character
 +	  @param hi  The ending character
 +	  @return A new string containing all the characters from low thru hi.
 +	  */
 +	CMString classCreateRange(wchar_t low, wchar_t hi)         const;
 +
 +	/**
 +	  Extracts a decimal number from the substring of member-variable
 +	  <code>{@link pattern pattern}<code> starting at <code>start</code> and
 +	  ending at <code>end</code>.
 +	  @param start The starting index in <code>{@link pattern pattern}<code>
 +	  @param end The last index in <code>{@link pattern pattern}<code>
 +	  @return The decimal number in <code>{@link pattern pattern}<code>
 +	  */
 +	int getInt(int start, int end);
 +	/**
 +	  Parses a <code>{n,m}</code> string out of the member-variable
 +	  <code>{@link pattern pattern}<code> stores the result in <code>sNum</code>
 +	  and <code>eNum</code>.
 +	  @param sNum Output parameter. The minimum number of matches required
 +	  by the curly quantifier are stored here.
 +	  @param eNum Output parameter. The maximum number of matches allowed
 +	  by the curly quantifier are stored here.
 +	  @return Success/Failure. Fails when the curly does not have the proper
 +	  syntax
 +	  */
 +	bool quantifyCurly(int & sNum, int & eNum);
 +	/**
 +	  Tries to quantify the currently parsed group. If the group being parsed
 +	  is indeed quantified in the member-variable
 +	  <code>{@link pattern pattern}<code>, then the NFA is modified accordingly.
 +	  @param start  The starting node of the current group being parsed
 +	  @param stop   The ending node of the current group being parsed
 +	  @param gn     The group number of the current group being parsed
 +	  @return       The node representing the starting node of the group. If the
 +	  group becomes quantified, then this node is not necessarily
 +	  a GroupHead node.
 +	  */
 +	NFAUNode * quantifyGroup(NFAUNode * start, NFAUNode * stop, const int gn);
 +
 +	/**
 +	  Tries to quantify the last parsed expression. If the character was indeed
 +	  quantified, then the NFA is modified accordingly.
 +	  @param newNode The recently created expression node
 +	  @return The node representing the last parsed expression. If the
 +	  expression was quantified, <code>return value != newNode</code>
 +	  */
 +	NFAUNode * quantify(NFAUNode * newNode);
 +	/**
 +	  Parses the current class being examined in
 +	  <code>{@link pattern pattern}</code>.
 +	  @return A string of unique characters contained in the current class being
 +	  parsed
 +	  */
 +	CMString parseClass();
 +	/**
 +	  Parses the current POSIX class being examined in
 +	  <code>{@link pattern pattern}</code>.
 +	  @return A string of unique characters representing the POSIX class being
 +	  parsed
 +	  */
 +	CMString parsePosix();
 +	/**
 +	  Returns a string containing the octal character being parsed
 +	  @return The string contained the octal value being parsed
 +	  */
 +	CMString parseOctal();
 +	/**
 +	  Returns a string containing the hex character being parsed
 +	  @return The string contained the hex value being parsed
 +	  */
 +	CMString parseHex();
 +	/**
 +	  Returns a new node representing the back reference being parsed
 +	  @return The new node representing the back reference being parsed
 +	  */
 +	NFAUNode *   parseBackref();
 +	/**
 +	  Parses the escape sequence currently being examined. Determines if the
 +	  escape sequence is a class, a single character, or the beginning of a
 +	  quotation sequence.
 +	  @param inv Output parameter. Whether or not to invert the returned class
 +	  @param quo Output parameter. Whether or not this sequence starts a
 +	  quotation.
 +	  @return The characters represented by the class
 +	  */
 +	CMString parseEscape(bool & inv, bool & quo);
 +	/**
 +	  Parses a supposed registered pattern currently under compilation. If the
 +	  sequence of characters does point to a registered pattern, then the
 +	  registered pattern is appended to <code>*end<code>. The registered pattern
 +	  is parsed with the current compilation flags.
 +	  @param end The ending node of the thus-far compiled pattern
 +	  @return The new end node of the current pattern
 +	  */
 +	NFAUNode * parseRegisteredWCPattern(NFAUNode ** end);
 +	/**
 +	  Parses a lookbehind expression. Appends the necessary nodes
 +	  <code>*end</code>.
 +	  @param pos Positive or negative look behind
 +	  @param end The ending node of the current pattern
 +	  @return The new end node of the current pattern
 +	  */
 +	NFAUNode * parseBehind(const bool pos, NFAUNode ** end);
 +	/**
 +	  Parses the current expression and tacks on nodes until a \E is found.
 +	  @return The end of the current pattern
 +	  */
 +	NFAUNode * parseQuote();
 +	/**
 +	  Parses <code>{@link pattern pattern}</code>. This function is called
 +	  recursively when an or (<code>|</code>) or a group is encountered.
 +	  @param inParen Are we currently parsing inside a group
 +	  @param inOr Are we currently parsing one side of an or (<code>|</code>)
 +	  @param end The end of the current expression
 +	  @return The starting node of the NFA constructed from this parse
 +	  */
 +	NFAUNode * parse(const bool inParen = 0, const bool inOr = 0, NFAUNode ** end = NULL);
 +public:
 +	/// We should match regardless of case
 +	const static unsigned long CASE_INSENSITIVE;
 +	/// We are implicitly quoted
 +	const static unsigned long LITERAL;
 +	/// @memo We should treat a <code><b>.</b></code> as [\x00-\x7F]
 +	const static unsigned long DOT_MATCHES_ALL;
 +	/** <code>^</code> and <code>$</code> should anchor to the beginning and
 +		 ending of lines, not all input
 +		 */
 +	const static unsigned long MULTILINE_MATCHING;
 +	/** When enabled, only instances of <code>\n</codes> are recognized as
 +		 line terminators
 +		 */
 +	const static unsigned long UNIX_LINE_MODE;
 +	/// The absolute minimum number of matches a quantifier can match (0)
 +	const static int MIN_QMATCH;
 +	/// The absolute maximum number of matches a quantifier can match (0x7FFFFFFF)
 +	const static int MAX_QMATCH;
 +public:
 +	/**
 +	  Call this function to compile a regular expression into a
 +	  <code>WCPattern</code> object. Special values can be assigned to
 +	  <code>mode</code> when certain non-standard behaviors are expected from
 +	  the <code>WCPattern</code> object.
 +	  @param pattern The regular expression to compile
 +	  @param mode    A bitwise or of flags signalling what special behaviors are
 +	  wanted from this <code>WCPattern</code> object
 +	  @return If successful, <code>compile</code> returns a <code>WCPattern</code>
 +	  pointer. Upon failure, <code>compile</code> returns
 +	  <code>NULL</code>
 +	  */
 +	static WCPattern                    * compile(const CMString & pattern,
 +		const unsigned long mode = 0);
 +	/**
 +	  Dont use this function. This function will compile a pattern, and cache
 +	  the result. This will eventually be used as an optimization when people
 +	  just want to call static methods using the same pattern over and over
 +	  instead of first compiling the pattern and then using the compiled
 +	  instance for matching.
 +	  @param pattern The regular expression to compile
 +	  @param mode    A bitwise or of flags signalling what special behaviors are
 +	  wanted from this <code>WCPattern</code> object
 +	  @return If successful, <code>compileAndKeep</code> returns a
 +	  <code>WCPattern</code> pointer. Upon failure, <code>compile</code>
 +	  returns <code>NULL</code>.
 +	  */
 +	static WCPattern                    * compileAndKeep(const CMString & pattern,
 +		const unsigned long mode = 0);
 +
 +	/**
 +	  Searches through <code>replace</code> and replaces all substrings matched
 +	  by <code>pattern</code> with <code>str</code>. <code>str</code> may
 +	  contain backreferences (e.g. <code>\1</code>) to capture groups. A typical
 +	  invocation looks like:
 +	  <p>
 +	  <code>
 +	  WCPattern::replace(L"(a+)b(c+)", L"abcccbbabcbabc", L"\\2b\\1");
 +	  </code>
 +	  <p>
 +	  which would replace <code>abcccbbabcbabc</code> with
 +	  <code>cccbabbcbabcba</code>.
 +	  @param pattern          The regular expression
 +	  @param str              The replacement text
 +	  @param replacementText  The string in which to perform replacements
 +	  @param mode             The special mode requested of the <code>WCPattern</code>
 +	  during the replacement process
 +	  @return The text with the replacement string substituted where necessary
 +	  */
 +	static CMString                  replace(const CMString & pattern,
 +		const CMString & str,
 +		const CMString & replacementText,
 +		const unsigned long mode = 0);
 +
 +	/**
 +	  Splits the specified string over occurrences of the specified pattern.
 +	  Empty strings can be optionally ignored. The number of strings returned is
 +	  configurable. A typical invocation looks like:
 +	  <p>
 +	  <code>
 +	  CMString str(strSize, 0);<br>
 +	  FILE * fp = fopen(fileName, "r");<br>
 +	  fread((char*)str.data(), strSize * 2, 1, fp);<br>
 +	  fclose(fp);<br>
 +	  <br>
 +	  std::vector<CMString> lines = WCPattern::split(L"[\r\n]+", str, true);<br>
 +	  <br>
 +	  </code>
 +
 +	  @param pattern    The regular expression
 +	  @param replace    The string to split
 +	  @param keepEmptys Whether or not to keep empty strings
 +	  @param limit      The maximum number of splits to make
 +	  @param mode       The special mode requested of the <code>WCPattern</code>
 +	  during the split process
 +	  @return All substrings of <code>str</code> split across <code>pattern</code>.
 +	  */
 +	static std::vector<CMString>     split(const CMString & pattern,
 +		const CMString & str,
 +		const bool keepEmptys = 0,
 +		const unsigned long limit = 0,
 +		const unsigned long mode = 0);
 +
 +	/**
 +	  Finds all the instances of the specified pattern within the string. You
 +	  should be careful to only pass patterns with a minimum length of one. For
 +	  example, the pattern <code>a*</code> can be matched by an empty string, so
 +	  instead you should pass <code>a+</code> since at least one character must
 +	  be matched. A typical invocation of <code>findAll</code> looks like:
 +	  <p>
 +	  <code>
 +	  std::vector<td::string> numbers = WCPattern::findAll(L"\\d+", string);
 +	  </code>
 +	  <p>
 +
 +	  @param pattern  The pattern for which to search
 +	  @param str      The string to search
 +	  @param mode     The special mode requested of the <code>WCPattern</code>
 +	  during the find process
 +	  @return All instances of <code>pattern</code> in <code>str</code>
 +	  */
 +	static std::vector<CMString>     findAll(const CMString & pattern,
 +		const CMString & str,
 +		const unsigned long mode = 0);
 +
 +	/**
 +	  Determines if an entire string matches the specified pattern
 +
 +	  @param pattern  The pattern for to match
 +	  @param str      The string to match
 +	  @param mode     The special mode requested of the <code>WCPattern</code>
 +	  during the replacement process
 +	  @return True if <code>str</code> is recognized by <code>pattern</code>
 +	  */
 +	static bool                         matches(const CMString & pattern,
 +		const CMString & str,
 +		const unsigned long mode = 0);
 +
 +	/**
 +	  Registers a pattern under a specific name for use in later compilations.
 +	  A typical invocation and later use looks like:
 +	  <p>
 +	  <code>
 +	  WCPattern::registerWCPattern(L"ip", L"(?:\\d{1,3}\\.){3}\\d{1,3}");<br>
 +	  WCPattern * p1 = WCPattern::compile(L"{ip}:\\d+");<br>
 +	  WCPattern * p2 = WCPattern::compile(L"Connection from ({ip}) on port \\d+");<br>
 +	  </code>
 +	  <p>
 +	  Multiple calls to <code>registerWCPattern</code> with the same
 +	  <code>name</code> will result in the pattern getting overwritten.
 +
 +	  @param name     The name to give to the pattern
 +	  @param pattern  The pattern to register
 +	  @param mode     Any special flags to use when compiling pattern
 +	  @return Success/Failure. Fails only if <code>pattern</code> has invalid
 +	  syntax
 +	  */
 +	static bool                         registerWCPattern(const CMString & name,
 +		const CMString & pattern,
 +		const unsigned long mode = 0);
 +
 +	/**
 +	  Clears the pattern registry
 +	  */
 +	static void                         unregisterWCPatterns();
 +	/**
 +	  Don't use
 +	  */
 +	static void                         clearWCPatternCache();
 +
 +	/**
 +	  Searches through a string for the <code>n<sup>th</sup></code> match of the
 +	  given pattern in the string. Match indeces start at zero, not one.
 +	  A typical invocation looks like this:
 +	  <p>
 +	  <code>
 +	  std::pair<CMString, int> match = WCPattern::findNthMatch(L"\\d{1,3}", L"192.168.1.101:22", 1);<br>
 +	  wprintf(L"%s %i\n", match.first.c_str(), match.second);<br>
 +	  <br>
 +	  Output: 168 4<br>
 +	  <br>
 +
 +	  @param pattern  The pattern for which to search
 +	  @param str      The string to search
 +	  @param matchNum Which match to find
 +	  @param mode     Any special flags to use during the matching process
 +	  @return A string and an integer. The string is the string matched. The
 +	  integer is the starting location of the matched string in
 +	  <code>str</code>. You can check for success/failure by making sure
 +	  that the integer returned is greater than or equal to zero.
 +	  */
 +	static std::pair<CMString, int>  findNthMatch(const CMString & pattern,
 +		const CMString & str,
 +		const int matchNum,
 +		const unsigned long mode = 0);
 +public:
 +	/**
 +	  Deletes all NFA nodes allocated during compilation
 +	  */
 +	~WCPattern();
 +
 +	CMString               replace(const CMString & str,
 +		const CMString & replacementText);
 +	std::vector<CMString>  split(const CMString & str, const bool keepEmptys = 0,
 +		const unsigned long limit = 0);
 +	std::vector<CMString>  findAll(const CMString & str);
 +	bool                       matches(const CMString & str);
 +	/**
 +	  Returns the flags used during compilation of this pattern
 +	  @return The flags used during compilation of this pattern
 +	  */
 +	unsigned long             getFlags() const;
 +	/**
 +	  Returns the regular expression this pattern represents
 +	  @return The regular expression this pattern represents
 +	  */
 +	CMString               getWCPattern() const;
 +	/**
 +	  Creates a matcher object using the specified string and this pattern.
 +	  @param str The string to match against
 +	  @return A new matcher using object using this pattern and the specified
 +	  string
 +	  */
 +	WCMatcher                 * createWCMatcher(const CMString & str);
  };
  class NFAUNode
  {
 -  friend class WCMatcher;
 -  public:
 -    NFAUNode * next;
 -    NFAUNode();
 -    virtual ~NFAUNode();
 -    virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const = 0;
 -    inline virtual bool isGroupHeadNode()     const { return false; }
 -    inline virtual bool isStartOfInputNode()  const { return false; }
 +	friend class WCMatcher;
 +public:
 +	NFAUNode * next;
 +	NFAUNode();
 +	virtual ~NFAUNode();
 +	virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const = 0;
 +	inline virtual bool isGroupHeadNode()     const { return false; }
 +	inline virtual bool isStartOfInputNode()  const { return false; }
  };
  class NFACharUNode : public NFAUNode
  {
 -  protected:
 -    wchar_t ch;
 -  public:
 -    NFACharUNode(const wchar_t c);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +protected:
 +	wchar_t ch;
 +public:
 +	NFACharUNode(const wchar_t c);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFACICharUNode : public NFAUNode
  {
 -  protected:
 -    wchar_t ch;
 -  public:
 -    NFACICharUNode(const wchar_t c);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +protected:
 +	wchar_t ch;
 +public:
 +	NFACICharUNode(const wchar_t c);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAStartUNode : public NFAUNode
  {
 -  public:
 -    NFAStartUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAStartUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAEndUNode : public NFAUNode
  {
 -  public:
 -    NFAEndUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAEndUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAQuantifierUNode : public NFAUNode
  {
 -  public:
 -    int min, max;
 -    NFAUNode * inner;
 -    virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 -    NFAQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 -                      const int minMatch = WCPattern::MIN_QMATCH,
 -                      const int maxMatch = WCPattern::MAX_QMATCH);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	int min, max;
 +	NFAUNode * inner;
 +	virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 +	NFAQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 +		const int minMatch = WCPattern::MIN_QMATCH,
 +		const int maxMatch = WCPattern::MAX_QMATCH);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAGreedyQuantifierUNode : public NFAQuantifierUNode
  {
 -  public:
 -    NFAGreedyQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 -                            const int minMatch = WCPattern::MIN_QMATCH,
 -                            const int maxMatch = WCPattern::MAX_QMATCH);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 -    virtual int matchInternal(const bkstring & str, WCMatcher * matcher, const int curInd, const int soFar) const;
 +public:
 +	NFAGreedyQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 +		const int minMatch = WCPattern::MIN_QMATCH,
 +		const int maxMatch = WCPattern::MAX_QMATCH);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
 +	virtual int matchInternal(const CMString & str, WCMatcher * matcher, const int curInd, const int soFar) const;
  };
  class NFALazyQuantifierUNode : public NFAQuantifierUNode
  {
 -  public:
 -    NFALazyQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 -                          const int minMatch = WCPattern::MIN_QMATCH,
 -                          const int maxMatch = WCPattern::MAX_QMATCH);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFALazyQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 +		const int minMatch = WCPattern::MIN_QMATCH,
 +		const int maxMatch = WCPattern::MAX_QMATCH);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAPossessiveQuantifierUNode : public NFAQuantifierUNode
  {
 -  public:
 -    NFAPossessiveQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 -                                const int minMatch = WCPattern::MIN_QMATCH,
 -                                const int maxMatch = WCPattern::MAX_QMATCH);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAPossessiveQuantifierUNode(WCPattern * pat, NFAUNode * internal,
 +		const int minMatch = WCPattern::MIN_QMATCH,
 +		const int maxMatch = WCPattern::MAX_QMATCH);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAAcceptUNode : public NFAUNode
  {
 -  public:
 -    NFAAcceptUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAAcceptUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAClassUNode : public NFAUNode
  {
 -  public:
 -    bool inv;
 -    std::map<wchar_t, bool> vals;
 -    NFAClassUNode(const bool invert = 0);
 -    NFAClassUNode(const bkstring & clazz, const bool invert);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	bool inv;
 +	std::map<wchar_t, bool> vals;
 +	NFAClassUNode(const bool invert = 0);
 +	NFAClassUNode(const CMString & clazz, const bool invert);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFACIClassUNode : public NFAUNode
  {
 -  public:
 -    bool inv;
 -    std::map<wchar_t, bool> vals;
 -    NFACIClassUNode(const bool invert = 0);
 -    NFACIClassUNode(const bkstring & clazz, const bool invert);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	bool inv;
 +	std::map<wchar_t, bool> vals;
 +	NFACIClassUNode(const bool invert = 0);
 +	NFACIClassUNode(const CMString & clazz, const bool invert);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFASubStartUNode : public NFAUNode
  {
 -  public:
 -    NFASubStartUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFASubStartUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAOrUNode : public NFAUNode
  {
 -  public:
 -    NFAUNode * one;
 -    NFAUNode * two;
 -    NFAOrUNode(NFAUNode * first, NFAUNode * second);
 -    virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAUNode * one;
 +	NFAUNode * two;
 +	NFAOrUNode(NFAUNode * first, NFAUNode * second);
 +	virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAQuoteUNode : public NFAUNode
  {
 -  public:
 -    bkstring qStr;
 -    NFAQuoteUNode(const bkstring & quoted);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	CMString qStr;
 +	NFAQuoteUNode(const CMString & quoted);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFACIQuoteUNode : public NFAUNode
  {
 -  public:
 -    bkstring qStr;
 -    NFACIQuoteUNode(const bkstring & quoted);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	CMString qStr;
 +	NFACIQuoteUNode(const CMString & quoted);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFALookAheadUNode : public NFAUNode
  {
 -  public:
 -    bool pos;
 -    NFAUNode * inner;
 -    NFALookAheadUNode(NFAUNode * internal, const bool positive);
 -    virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	bool pos;
 +	NFAUNode * inner;
 +	NFALookAheadUNode(NFAUNode * internal, const bool positive);
 +	virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFALookBehindUNode : public NFAUNode
  {
 -  public:
 -    bool pos;
 -    bkstring mStr;
 -    NFALookBehindUNode(const bkstring & str, const bool positive);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	bool pos;
 +	CMString mStr;
 +	NFALookBehindUNode(const CMString & str, const bool positive);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAStartOfLineUNode : public NFAUNode
  {
 -  public:
 -    NFAStartOfLineUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAStartOfLineUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAEndOfLineUNode : public NFAUNode
  {
 -  public:
 -    NFAEndOfLineUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAEndOfLineUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAReferenceUNode : public NFAUNode
  {
 -  public:
 -    int gi;
 -    NFAReferenceUNode(const int groupIndex);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	int gi;
 +	NFAReferenceUNode(const int groupIndex);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAStartOfInputUNode : public NFAUNode
  {
 -  public:
 -    NFAStartOfInputUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 -    inline virtual bool isStartOfInputNode()  const { return false; }
 +public:
 +	NFAStartOfInputUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
 +	inline virtual bool isStartOfInputNode()  const { return false; }
  };
  class NFAEndOfInputUNode : public NFAUNode
  {
 -  public:
 -    bool term;
 -    NFAEndOfInputUNode(const bool lookForTerm);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	bool term;
 +	NFAEndOfInputUNode(const bool lookForTerm);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAWordBoundaryUNode : public NFAUNode
  {
 -  public:
 -    bool pos;
 -    NFAWordBoundaryUNode(const bool positive);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	bool pos;
 +	NFAWordBoundaryUNode(const bool positive);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAEndOfMatchUNode : public NFAUNode
  {
 -  public:
 -    NFAEndOfMatchUNode();
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	NFAEndOfMatchUNode();
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAGroupHeadUNode : public NFAUNode
  {
 -  public:
 -    int gi;
 -    NFAGroupHeadUNode(const int groupIndex);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 -    inline virtual bool isGroupHeadNode()     const { return false; }
 +public:
 +	int gi;
 +	NFAGroupHeadUNode(const int groupIndex);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
 +	inline virtual bool isGroupHeadNode()     const { return false; }
  };
  class NFAGroupTailUNode : public NFAUNode
  {
 -  public:
 -    int gi;
 -    NFAGroupTailUNode(const int groupIndex);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	int gi;
 +	NFAGroupTailUNode(const int groupIndex);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAGroupLoopPrologueUNode : public NFAUNode
  {
 -  public:
 -    int gi;
 -    NFAGroupLoopPrologueUNode(const int groupIndex);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	int gi;
 +	NFAGroupLoopPrologueUNode(const int groupIndex);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  class NFAGroupLoopUNode : public NFAUNode
  {
 -  public:
 -    int gi, min, max, type;
 -    NFAUNode * inner;
 -    NFAGroupLoopUNode(NFAUNode * internal, const int minMatch,
 -                     const int maxMatch, const int groupIndex, const int matchType);
 -    virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 -    virtual int match(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 -    int matchGreedy(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 -    int matchLazy(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 -    int matchPossessive(const bkstring & str, WCMatcher * matcher, const int curInd = 0) const;
 +public:
 +	int gi, min, max, type;
 +	NFAUNode * inner;
 +	NFAGroupLoopUNode(NFAUNode * internal, const int minMatch,
 +		const int maxMatch, const int groupIndex, const int matchType);
 +	virtual void findAllNodes(std::map<NFAUNode*, bool> & soFar);
 +	virtual int match(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
 +	int matchGreedy(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
 +	int matchLazy(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
 +	int matchPossessive(const CMString & str, WCMatcher * matcher, const int curInd = 0) const;
  };
  #endif
 diff --git a/plugins/SmileyAdd/src/services.cpp b/plugins/SmileyAdd/src/services.cpp index 30717b81c1..f42e23978b 100644 --- a/plugins/SmileyAdd/src/services.cpp +++ b/plugins/SmileyAdd/src/services.cpp @@ -25,52 +25,41 @@ LIST<void> menuHandleArray(5);  SmileyPackType* GetSmileyPack(const char* proto, HANDLE hContact, SmileyPackCType** smlc)
  {
 -	bkstring categoryName;
 -
  	hContact = DecodeMetaContact(hContact);
 -	if (smlc) *smlc = opt.DisableCustom ? NULL : g_SmileyPackCStore.GetSmileyPack(hContact);
 +	if (smlc)
 +		*smlc = opt.DisableCustom ? NULL : g_SmileyPackCStore.GetSmileyPack(hContact);
 -	if (proto != NULL && IsBadStringPtrA(proto, 10)) return NULL;
 +	if (proto != NULL && IsBadStringPtrA(proto, 10))
 +		return NULL;
 -	if (hContact != NULL)
 -	{
 +	CMString categoryName;
 +	if (hContact != NULL) {
  		opt.ReadContactCategory(hContact, categoryName);
  		if (categoryName == _T("<None>")) return NULL;
 -		if (!categoryName.empty() && 
 -			g_SmileyCategories.GetSmileyCategory(categoryName) == NULL)
 -		{
 -			categoryName.clear();
 +		if (!categoryName.IsEmpty() && g_SmileyCategories.GetSmileyCategory(categoryName) == NULL) {
 +			categoryName.Empty();
  			opt.WriteContactCategory(hContact, categoryName);
  		}
 -		if (categoryName.empty() && !opt.UseOneForAll)
 -		{
 +		if (categoryName.IsEmpty() && !opt.UseOneForAll) {
  			char *protonam = GetContactProto(hContact);
 -			if (protonam != NULL)
 -			{
 +			if (protonam != NULL) {
  				DBVARIANT dbv;
 -				if (db_get_ts(hContact, protonam, "Transport", &dbv) == 0)
 -				{
 +				if (db_get_ts(hContact, protonam, "Transport", &dbv) == 0) {
  					categoryName = dbv.ptszVal;
  					db_free(&dbv);
  				}
 -				else
 -					categoryName = A2T_SM(protonam);
 +				else categoryName = A2T_SM(protonam);
  			}
  		}
  	}
 -	if (categoryName.empty())
 -	{
 +	if (categoryName.IsEmpty()) {
  		if (proto == NULL || proto[0] == 0)
 -		{
  			categoryName = _T("Standard");
 -		}
 -		else 
 -		{
 +		else {
  			categoryName = A2T_SM(proto);
 -			if (opt.UseOneForAll) 
 -			{
 +			if (opt.UseOneForAll) {
  				SmileyCategoryType *smc = g_SmileyCategories.GetSmileyCategory(categoryName);
  				if (smc == NULL || smc->IsProto()) categoryName = _T("Standard");
  			}
 @@ -84,7 +73,8 @@ SmileyPackType* GetSmileyPack(const char* proto, HANDLE hContact, SmileyPackCTyp  INT_PTR ReplaceSmileysCommand(WPARAM, LPARAM lParam)
  {
  	SMADD_RICHEDIT3* smre = (SMADD_RICHEDIT3*) lParam;
 -	if (smre == NULL || smre->cbSize < SMADD_RICHEDIT_SIZE_V1) return FALSE;
 +	if (smre == NULL || smre->cbSize < SMADD_RICHEDIT_SIZE_V1)
 +		return FALSE;
  	SMADD_RICHEDIT3 smrec = {0};
  	memcpy(&smrec, smre, min(smre->cbSize, sizeof(smrec)));
 @@ -137,8 +127,7 @@ INT_PTR GetSmileyIconCommand(WPARAM, LPARAM lParam)  	SmileyPackType* SmileyPack = GetSmileyPack(smre->Protocolname);
 -	if (SmileyPack == NULL || IsBadStringPtrA(smre->SmileySequence, MAX_SMILEY_LENGTH))
 -	{
 +	if (SmileyPack == NULL || IsBadStringPtrA(smre->SmileySequence, MAX_SMILEY_LENGTH)) {
  		smre->SmileyIcon = NULL;
  		smre->Smileylength = 0;
  		return FALSE;
 @@ -356,10 +345,10 @@ INT_PTR RegisterPack(WPARAM, LPARAM lParam) -	bkstring nmd(A2W_SM(smre->dispname, lpcp));
 +	CMString nmd(A2W_SM(smre->dispname, lpcp));
 -	bkstring nm(A2T_SM(smre->name));
 +	CMString nm(A2T_SM(smre->name));
  	g_SmileyCategories.AddAndLoad(nm, nmd);
  	return TRUE;
 @@ -375,7 +364,7 @@ INT_PTR CustomCatMenu(WPARAM wParam, LPARAM lParam)  			opt.WriteContactCategory(hContact, smct->GetName());
  		else
  		{
 -			bkstring empty;
 +			CMString empty;
  			if (lParam == 1) empty = _T("<None>");
  			opt.WriteContactCategory(hContact, empty);
  		}
 @@ -410,7 +399,7 @@ int RebuildContactMenu(WPARAM wParam, LPARAM)  	menuHandleArray.destroy();
  	if (haveMenu) {
 -		bkstring cat;
 +		CMString cat;
  		opt.ReadContactCategory((HANDLE)wParam, cat);
  		CLISTMENUITEM mi = { sizeof(mi) };
 @@ -468,7 +457,7 @@ INT_PTR ReloadPack(WPARAM, LPARAM lParam)  {
  	if (lParam)
  	{
 -		bkstring categoryName = A2T_SM((char*)lParam);
 +		CMString categoryName = A2T_SM((char*)lParam);
  		SmileyCategoryType *smc = g_SmileyCategories.GetSmileyCategory(categoryName);
  		if (smc != NULL) smc->Load();
  	}
 @@ -509,8 +498,8 @@ int AccountListChanged(WPARAM wParam, LPARAM lParam)  	case PRAC_ADDED:
  		if (acc != NULL)
  		{
 -			bkstring catname(_T("Standard"));
 -			const bkstring& defaultFile = g_SmileyCategories.GetSmileyCategory(catname)->GetFilename();
 +			CMString catname(_T("Standard"));
 +			const CMString& defaultFile = g_SmileyCategories.GetSmileyCategory(catname)->GetFilename();
  			g_SmileyCategories.AddAccountAsCategory(acc, defaultFile);
  		}
  		break;
 @@ -518,7 +507,7 @@ int AccountListChanged(WPARAM wParam, LPARAM lParam)  	case PRAC_CHANGED:
  		if (acc != NULL && acc->szModuleName != NULL)
  		{
 -			bkstring name(A2T_SM(acc->szModuleName));
 +			CMString name(A2T_SM(acc->szModuleName));
  			SmileyCategoryType* smc = g_SmileyCategories.GetSmileyCategory(name);
  			if (smc != NULL)
  			{
 @@ -537,8 +526,8 @@ int AccountListChanged(WPARAM wParam, LPARAM lParam)  		{
  			if (acc->bIsEnabled)
  			{
 -				bkstring catname(_T("Standard"));
 -				const bkstring& defaultFile = g_SmileyCategories.GetSmileyCategory(catname)->GetFilename();
 +				CMString catname(_T("Standard"));
 +				const CMString& defaultFile = g_SmileyCategories.GetSmileyCategory(catname)->GetFilename();
  				g_SmileyCategories.AddAccountAsCategory(acc, defaultFile);
  			}
  			else
 @@ -561,7 +550,7 @@ int DbSettingChanged(WPARAM wParam, LPARAM lParam)  	if (strcmp(cws->szSetting, "Transport") == 0) 
  	{
 -		bkstring catname(_T("Standard"));
 +		CMString catname(_T("Standard"));
  		SmileyCategoryType *smc = g_SmileyCategories.GetSmileyCategory(catname);
  		if (smc != NULL)
  			g_SmileyCategories.AddContactTransportAsCategory(hContact, smc->GetFilename());
 diff --git a/plugins/SmileyAdd/src/smileyroutines.cpp b/plugins/SmileyAdd/src/smileyroutines.cpp index 67c011d1ea..cdabaa712a 100644 --- a/plugins/SmileyAdd/src/smileyroutines.cpp +++ b/plugins/SmileyAdd/src/smileyroutines.cpp @@ -48,18 +48,18 @@ void LookupAllSmileys(SmileyPackType* smileyPack, SmileyPackCType* smileyCPack,  	SmileyLookup::SmileyLocVecType* smileys = new SmileyLookup::SmileyLocVecType [smlsz];
  	// Find all possible smileys
 -	bkstring tmpstr(lpstrText);
 +	CMString tmpstr(lpstrText);
  	int i = 0;
  	if (sml)
  		for (int j=0; j < sml->getCount(); j++) {
 -			(*sml)[j].find(tmpstr, smileys[i], false);
 +			(*sml)[j].Find(tmpstr, smileys[i], false);
  			i++;
  		}
  	if (smlc)
  		for (int j=0; j < smlc->getCount(); j++) {
 -			(*smlc)[j].find(tmpstr, smileys[i], false);
 +			(*smlc)[j].Find(tmpstr, smileys[i], false);
  			i++;
  		}
 @@ -67,7 +67,7 @@ void LookupAllSmileys(SmileyPackType* smileyPack, SmileyPackCType* smileyCPack,  	memset(csmlit, 0, smlsz * sizeof(int));
  	long numCharsSoFar = 0;
 -	bkstring::size_type smloff = 0;
 +	int smloff = 0;
  	while (true) {
  		int firstSml = -1;
 @@ -137,7 +137,7 @@ void LookupAllSmileys(SmileyPackType* smileyPack, SmileyPackCType* smileyCPack,  		else delete dat;
  		// Advance string pointer to search for the next smiley
 -		smloff = (*smlf)[firstSmlRef].pos + (*smlf)[firstSmlRef].len;
 +		smloff = int((*smlf)[firstSmlRef].pos + (*smlf)[firstSmlRef].len);
  		csmlit[firstSml]++;
  	}
  	delete[] smileys;
 diff --git a/plugins/SmileyAdd/src/smileys.cpp b/plugins/SmileyAdd/src/smileys.cpp index e81bc18c28..94da1c34bd 100644 --- a/plugins/SmileyAdd/src/smileys.cpp +++ b/plugins/SmileyAdd/src/smileys.cpp @@ -75,14 +75,14 @@ bool SmileyType::LoadFromImage(IStream* pStream)  {
  	if (m_xepimg) m_xepimg->Release();
 -	bkstring name;
 +	CMString name;
  	m_xepimg = new ImageType(0, name, pStream);
  	return true;
  }
 -bool SmileyType::LoadFromResource(const bkstring& file, const int index)
 +bool SmileyType::LoadFromResource(const CMString& file, const int index)
  {
  	m_index = index;
  	m_filepath = file;
 @@ -174,9 +174,9 @@ void SmileyType::CallSmileyService(HANDLE hContact)  	_TMatcher * m0 = srvsplit->createTMatcher(GetTriggerText());
  	m0->findFirstMatch();
 -	bkstring name = m0->getGroup(1);
 -	bkstring par1 = m0->getGroup(2);
 -	bkstring par2 = m0->getGroup(3);
 +	CMString name = m0->getGroup(1);
 +	CMString par1 = m0->getGroup(2);
 +	CMString par2 = m0->getGroup(3);
  	delete m0;
  	delete srvsplit;
 @@ -211,7 +211,7 @@ void SmileyPackType::AddTriggersToSmileyLookup(void)  {
  	_TPattern * p = _TPattern::compile(_T("\\s+"));
  	{
 -		bkstring emptystr;
 +		CMString emptystr;
  		m_SmileyLookup.insert(new SmileyLookup(urlRegEx, true, -1, emptystr));
  		m_SmileyLookup.insert(new SmileyLookup(pathRegEx, true, -1, emptystr));
  		m_SmileyLookup.insert(new SmileyLookup(timeRegEx, true, -1, emptystr));
 @@ -224,7 +224,8 @@ void SmileyPackType::AddTriggersToSmileyLookup(void)  				m_SmileyLookup.insert(dats);
  			else 
  				errorFound = true;
 -			if (m_SmileyList[dist].m_InsertText.empty()) m_SmileyList[dist].m_InsertText = m_SmileyList[dist].m_ToolText;
 +			if (m_SmileyList[dist].m_InsertText.IsEmpty())
 +				m_SmileyList[dist].m_InsertText = m_SmileyList[dist].m_ToolText;
  		}
  		else if (!m_SmileyList[dist].IsService()) {
  			bool first = true;
 @@ -234,8 +235,8 @@ void SmileyPackType::AddTriggersToSmileyLookup(void)  			{	
  				int stind = m0->getStartingIndex();
  				if (li != stind) {
 -					bkstring out;
 -					ReplaceAllSpecials(m0->getString().substr(li, stind - li), out);
 +					CMString out;
 +					ReplaceAllSpecials(m0->getString().Mid(li, stind - li), out);
  					SmileyLookup *dats = new SmileyLookup(out, false, dist, GetFilename()); 
  					if (dats->IsValid()) {
  						m_SmileyLookup.insert(dats);
 @@ -248,10 +249,10 @@ void SmileyPackType::AddTriggersToSmileyLookup(void)  				li = m0->getEndingIndex();
  			}
 -			int stind = (int)m0->getString().size();
 +			int stind = (int)m0->getString().GetLength();
  			if (li < stind) {
 -				bkstring out;
 -				ReplaceAllSpecials(m0->getString().substr(li, stind - li), out);
 +				CMString out;
 +				ReplaceAllSpecials(m0->getString().Mid(li, stind - li), out);
  				SmileyLookup *dats = new SmileyLookup(out, false, dist, GetFilename()); 
  				if (dats->IsValid()) {
  					m_SmileyLookup.insert(dats);
 @@ -267,7 +268,7 @@ void SmileyPackType::AddTriggersToSmileyLookup(void)  	delete p;
  }
 -void SmileyPackType::ReplaceAllSpecials(const bkstring& Input, bkstring& Output)
 +void SmileyPackType::ReplaceAllSpecials(const CMString& Input, CMString& Output)
  {
  	Output = _TPattern::replace(_T("%%_{1,2}%%"), Input, _T(" "));
  	Output = _TPattern::replace(_T("%%''%%"), Output, _T("\""));
 @@ -278,26 +279,26 @@ void SmileyPackType::Clear(void)  	m_SmileyList.destroy();
  	m_SmileyLookup.destroy();
  	if (m_hSmList != NULL) { ImageList_Destroy(m_hSmList); m_hSmList = NULL; }
 -	m_Filename.clear();
 -	m_Name.clear();
 -	m_Date.clear();
 -	m_Version.clear();
 -	m_Author.clear();
 +	m_Filename.Empty();
 +	m_Name.Empty();
 +	m_Date.Empty();
 +	m_Version.Empty();
 +	m_Author.Empty();
  	m_VisibleCount = 0;
 -	m_ButtonSmiley.clear();
 +	m_ButtonSmiley.Empty();
  	errorFound = false;
  }
 -bool SmileyPackType::LoadSmileyFile(const bkstring& filename, bool onlyInfo, bool noerr)
 +bool SmileyPackType::LoadSmileyFile(const CMString& filename, bool onlyInfo, bool noerr)
  {
  	Clear();
 -	if (filename.empty()) {
 +	if (filename.IsEmpty()) {
  		m_Name = _T("Nothing loaded");
  		return false;
  	}
 -	bkstring modpath;
 +	CMString modpath;
  	pathToAbsolute(filename, modpath);
  	// Load xep file
 @@ -329,7 +330,7 @@ bool SmileyPackType::LoadSmileyFile(const bkstring& filename, bool onlyInfo, boo  	// Close file
  	_close(fh);
 -	bkstring tbuf;
 +	CMString tbuf;
  	if (len>2 && *(wchar_t*)buf == 0xfeff)
  		tbuf = W2T_SM((wchar_t*)buf+1);
 @@ -341,7 +342,7 @@ bool SmileyPackType::LoadSmileyFile(const bkstring& filename, bool onlyInfo, boo  	delete[] buf;
  	bool res;
 -	if (filename.find(_T(".xep")) == filename.npos) 
 +	if (filename.Find(_T(".xep")) == -1) 
  		res = LoadSmileyFileMSL(tbuf, onlyInfo, modpath);
  	else
  		res = LoadSmileyFileXEP(tbuf, onlyInfo, modpath);
 @@ -352,14 +353,14 @@ bool SmileyPackType::LoadSmileyFile(const bkstring& filename, bool onlyInfo, boo  	return res;
  }
 -bool SmileyPackType::LoadSmileyFileMSL(bkstring& tbuf, bool onlyInfo, bkstring& modpath) 
 +bool SmileyPackType::LoadSmileyFileMSL(CMString& tbuf, bool onlyInfo, CMString& modpath) 
  {
  	_TPattern * pathsplit = _TPattern::compile(_T("(.*\\\\)(.*)\\.|$"));
  	_TMatcher * m0 = pathsplit->createTMatcher(modpath);
  	m0->findFirstMatch();
 -	const bkstring pathstr = m0->getGroup(1);
 -	const bkstring packstr = m0->getGroup(2);
 +	const CMString pathstr = m0->getGroup(1);
 +	const CMString packstr = m0->getGroup(2);
  	delete m0;
  	delete pathsplit;
 @@ -421,31 +422,26 @@ bool SmileyPackType::LoadSmileyFileMSL(bkstring& tbuf, bool onlyInfo, bkstring&  		SmileyVectorType hiddenSmileys;
  		unsigned smnum = 0;
 -		while (m0->findNextMatch())
 -		{
 -			bkstring resname = m0->getGroup(2);
 -			if (resname.find(_T("http://")) != resname.npos)
 -			{
 -				if (GetSmileyFile(resname, packstr)) continue;
 -			}
 -			else
 -			{
 -				if (!resname.empty()) resname.insert(0, pathstr);
 +		while (m0->findNextMatch()) {
 +			CMString resname = m0->getGroup(2);
 +			if (resname.Find(_T("http://")) != -1) {
 +				if (GetSmileyFile(resname, packstr))
 +					continue;
  			}
 +			else if (!resname.IsEmpty())
 +				resname.Insert(0, pathstr);
  			SmileyType *dat = new SmileyType;
  			const int iconIndex = _ttol(m0->getGroup(3).c_str());
  			dat->SetHidden(m0->getStartingIndex(1) >= 0);
 -			if (m0->getStartingIndex(4) >= 0)
 -			{
 +			if (m0->getStartingIndex(4) >= 0) {
  				dat->SetRegEx(m0->getGroup(4) == _T("R"));
  				dat->SetService(m0->getGroup(4) == _T("S"));
  			}
  			dat->m_TriggerText = m0->getGroup(5);
 -			if (dat->IsRegEx())
 -			{
 +			if (dat->IsRegEx()) {
  				if (m0->getStartingIndex(6) >= 0)
  					ReplaceAllSpecials(m0->getGroup(6), dat->m_InsertText);
 @@ -454,8 +450,7 @@ bool SmileyPackType::LoadSmileyFileMSL(bkstring& tbuf, bool onlyInfo, bkstring&  				else
  					dat->m_ToolText = dat->m_InsertText;
  			}
 -			else
 -			{
 +			else {
  				if (m0->getStartingIndex(6) >= 0)
  					ReplaceAllSpecials(m0->getGroup(6), dat->m_ToolText);
  				else
 @@ -463,8 +458,7 @@ bool SmileyPackType::LoadSmileyFileMSL(bkstring& tbuf, bool onlyInfo, bkstring&  			}
  			bool noerr;
 -			if (resname.empty())
 -			{
 +			if (resname.IsEmpty()) {
  				dat->SetHidden(true);
  				dat->SetText(true);
  				noerr = true;
 @@ -477,8 +471,7 @@ bool SmileyPackType::LoadSmileyFileMSL(bkstring& tbuf, bool onlyInfo, bkstring&  			else
  				m_SmileyList.insert(dat);
 -			if (!noerr)
 -			{
 +			if (!noerr) {
  				static const TCHAR errmsg[] = LPGENT("Smiley #%u in file %s for Smiley Pack %s not found."); 
  				TCHAR msgtxt[1024];
  				mir_sntprintf(msgtxt, SIZEOF(msgtxt), TranslateTS(errmsg), smnum, resname.c_str(), modpath.c_str());
 @@ -501,12 +494,11 @@ bool SmileyPackType::LoadSmileyFileMSL(bkstring& tbuf, bool onlyInfo, bkstring&  }
 -static void DecodeHTML(bkstring& str)
 +static void DecodeHTML(CMString& str)
  {
 -	if (str.find('&') != str.npos)
 -	{
 -		str = _TPattern::replace(bkstring(_T("<")), str, bkstring(_T("<")));
 -		str = _TPattern::replace(bkstring(_T(">")), str, bkstring(_T(">")));
 +	if (str.Find('&') != -1) {
 +		str = _TPattern::replace(CMString(_T("<")), str, CMString(_T("<")));
 +		str = _TPattern::replace(CMString(_T(">")), str, CMString(_T(">")));
  	}
  }
 @@ -533,7 +525,7 @@ static IStream* DecodeBase64Data(const char* pData)  }
 -bool SmileyPackType::LoadSmileyFileXEP(bkstring& tbuf, bool onlyInfo, bkstring& )
 +bool SmileyPackType::LoadSmileyFileXEP(CMString& tbuf, bool onlyInfo, CMString& )
  {
  	_TMatcher *m0, *m1, *m2;
 @@ -547,7 +539,7 @@ bool SmileyPackType::LoadSmileyFileXEP(bkstring& tbuf, bool onlyInfo, bkstring&  	m0 = settings_re->createTMatcher(tbuf);
  	if (m0->findFirstMatch())
  	{
 -		bkstring settings = m0->getGroup(1);
 +		CMString settings = m0->getGroup(1);
  		m1 = author_re->createTMatcher(settings);
  		if (m1->findFirstMatch())
 @@ -589,7 +581,7 @@ bool SmileyPackType::LoadSmileyFileXEP(bkstring& tbuf, bool onlyInfo, bkstring&  		m0 = images_re->createTMatcher(tbuf);
  		if (m0->findFirstMatch())
  		{
 -			bkstring images = m0->getGroup(1);
 +			CMString images = m0->getGroup(1);
  			m1 = imagedt_re->createTMatcher(images);
  			if (m1->findFirstMatch())
 @@ -616,7 +608,7 @@ bool SmileyPackType::LoadSmileyFileXEP(bkstring& tbuf, bool onlyInfo, bkstring&  			dat->m_ToolText = m0->getGroup(2);
  			DecodeHTML(dat->m_ToolText);
 -			bkstring rec = m0->getGroup(3);
 +			CMString rec = m0->getGroup(3);
  			m1 = expression_re->createTMatcher(rec);
  			if (m1->findFirstMatch())
 @@ -633,12 +625,12 @@ bool SmileyPackType::LoadSmileyFileXEP(bkstring& tbuf, bool onlyInfo, bkstring&  				DecodeHTML(dat->m_InsertText);
  			}
  			delete m1;
 -			dat->SetHidden(dat->m_InsertText.empty());
 +			dat->SetHidden(dat->m_InsertText.IsEmpty());
  			m1 = image_re->createTMatcher(rec);
  			if (m1->findFirstMatch())
  			{
 -				bkstring images = m1->getGroup(1);
 +				CMString images = m1->getGroup(1);
  				m2 = imagedt_re->createTMatcher(images);
  				if (m2->findFirstMatch())
 @@ -684,7 +676,7 @@ bool SmileyPackType::LoadSmileyFileXEP(bkstring& tbuf, bool onlyInfo, bkstring&  //
 -bool SmileyPackListType::AddSmileyPack(bkstring& filename)
 +bool SmileyPackListType::AddSmileyPack(CMString& filename)
  {
  	bool res = true;
  	if (GetSmileyPack(filename) == NULL)
 @@ -701,13 +693,13 @@ bool SmileyPackListType::AddSmileyPack(bkstring& filename)  }
 -SmileyPackType* SmileyPackListType::GetSmileyPack(bkstring& filename)
 +SmileyPackType* SmileyPackListType::GetSmileyPack(CMString& filename)
  {
 -	bkstring modpath;
 +	CMString modpath;
  	pathToAbsolute(filename, modpath);
  	for (int i=0; i < m_SmileyPacks.getCount(); i++) {
 -		bkstring modpath1;
 +		CMString modpath1;
  		pathToAbsolute(m_SmileyPacks[i].GetFilename(), modpath1);
  		if (lstrcmpi(modpath.c_str(), modpath1.c_str()) == 0) return &m_SmileyPacks[i];
  	}
 @@ -725,9 +717,9 @@ void SmileyPackListType::ClearAndFreeAll()  //
 -SmileyCategoryType::SmileyCategoryType(SmileyPackListType* pSPS, const bkstring& name, 
 -	const bkstring& displayName, 
 -	const bkstring& defaultFilename, SmcType typ)
 +SmileyCategoryType::SmileyCategoryType(SmileyPackListType* pSPS, const CMString& name, 
 +	const CMString& displayName, 
 +	const CMString& defaultFilename, SmcType typ)
  { 
  	m_pSmileyPackStore = pSPS; 
  	type = typ; 
 @@ -769,10 +761,10 @@ void SmileyCategoryListType::ClearAndLoadAll(void)  }
 -SmileyCategoryType* SmileyCategoryListType::GetSmileyCategory(const bkstring& name)
 +SmileyCategoryType* SmileyCategoryListType::GetSmileyCategory(const CMString& name)
  {
  	for (int i=0; i < m_SmileyCategories.getCount(); i++)
 -		if (name.comparei(m_SmileyCategories[i].GetName()) == 0)
 +		if (name.CompareNoCase(m_SmileyCategories[i].GetName()) == 0)
  			return &m_SmileyCategories[i];
  	return NULL;
 @@ -785,7 +777,7 @@ SmileyCategoryType* SmileyCategoryListType::GetSmileyCategory(unsigned index)  }
 -SmileyPackType* SmileyCategoryListType::GetSmileyPack(bkstring& categoryname) 
 +SmileyPackType* SmileyCategoryListType::GetSmileyPack(CMString& categoryname) 
  {
  	SmileyCategoryType* smc = GetSmileyCategory(categoryname);
  	return smc != NULL ? smc->GetSmileyPack() : NULL; 
 @@ -794,11 +786,11 @@ SmileyPackType* SmileyCategoryListType::GetSmileyPack(bkstring& categoryname)  void SmileyCategoryListType::SaveSettings(void)
  {
 -	bkstring catstr;
 +	CMString catstr;
  	for (int i=0; i < m_SmileyCategories.getCount(); i++) {
  		m_SmileyCategories[i].SaveSettings();
  		if (m_SmileyCategories[i].IsCustom()) {
 -			if (!catstr.empty()) catstr += '#';
 +			if (!catstr.IsEmpty()) catstr += '#';
  			catstr += m_SmileyCategories[i].GetName();
  		}
  	}
 @@ -806,7 +798,7 @@ void SmileyCategoryListType::SaveSettings(void)  }
 -void SmileyCategoryListType::AddAndLoad(const bkstring& name, const bkstring& displayName)
 +void SmileyCategoryListType::AddAndLoad(const CMString& name, const CMString& displayName)
  {
  	if (GetSmileyCategory(name) != NULL)
  		return;
 @@ -818,8 +810,8 @@ void SmileyCategoryListType::AddAndLoad(const bkstring& name, const bkstring& di  }
 -void SmileyCategoryListType::AddCategory(const bkstring& name, const bkstring& displayName, 
 -	SmcType typ, const bkstring& defaultFilename)
 +void SmileyCategoryListType::AddCategory(const CMString& name, const CMString& displayName, 
 +	SmcType typ, const CMString& defaultFilename)
  {
  	if (GetSmileyCategory(name) == NULL)
  		m_SmileyCategories.insert(new SmileyCategoryType(m_pSmileyPackStore, name, 
 @@ -838,11 +830,11 @@ bool SmileyCategoryListType::DeleteCustomCategory(int index)  	return false;
  }
 -void SmileyCategoryListType::AddAccountAsCategory(PROTOACCOUNT *acc, const bkstring& defaultFile)
 +void SmileyCategoryListType::AddAccountAsCategory(PROTOACCOUNT *acc, const CMString& defaultFile)
  {
  	if (IsAccountEnabled(acc) && acc->szProtoName && IsSmileyProto(acc->szModuleName))
  	{
 -		bkstring displayName(acc->tszAccountName ? acc->tszAccountName : A2T_SM(acc->szModuleName));
 +		CMString displayName(acc->tszAccountName ? acc->tszAccountName : A2T_SM(acc->szModuleName));
  		const char* packnam = acc->szProtoName;
  		if (strcmp(packnam, "JABBER") == 0)
 @@ -853,20 +845,20 @@ void SmileyCategoryListType::AddAccountAsCategory(PROTOACCOUNT *acc, const bkstr  		char path[MAX_PATH];
  		mir_snprintf(path, sizeof(path), "Smileys\\nova\\%s.msl", packnam);
 -		bkstring paths = A2T_SM(path), patha; 
 +		CMString paths = A2T_SM(path), patha; 
  		pathToAbsolute(paths, patha);
  		if (_taccess(patha.c_str(), 0) != 0) 
  			paths = defaultFile;
 -		bkstring tname(A2T_SM(acc->szModuleName));
 +		CMString tname(A2T_SM(acc->szModuleName));
  		AddCategory(tname, displayName, smcProto, paths); 
  	}
  }
  void SmileyCategoryListType::DeleteAccountAsCategory(PROTOACCOUNT *acc)
  {
 -	bkstring tname(A2T_SM(acc->szModuleName));
 +	CMString tname(A2T_SM(acc->szModuleName));
  	for (HANDLE hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) {
  		char* proto = GetContactProto(hContact);
 @@ -875,7 +867,7 @@ void SmileyCategoryListType::DeleteAccountAsCategory(PROTOACCOUNT *acc)  		DBVARIANT dbv;
  		if (!db_get_ts(hContact, proto, "Transport", &dbv)) {
 -			bool found = (tname.comparei(dbv.ptszVal) == 0);
 +			bool found = (tname.CompareNoCase(dbv.ptszVal) == 0);
  			db_free(&dbv);
  			if (found)
  				return;
 @@ -883,14 +875,14 @@ void SmileyCategoryListType::DeleteAccountAsCategory(PROTOACCOUNT *acc)  	}
  	for (int i=0; i < m_SmileyCategories.getCount(); i++) {
 -		if (tname.comparei(m_SmileyCategories[i].GetName()) == 0) {
 +		if (tname.CompareNoCase(m_SmileyCategories[i].GetName()) == 0) {
  			m_SmileyCategories.remove(i);
  			break;
  		}
  	}
  }
 -void SmileyCategoryListType::AddContactTransportAsCategory(HANDLE hContact, const bkstring& defaultFile)
 +void SmileyCategoryListType::AddContactTransportAsCategory(HANDLE hContact, const CMString& defaultFile)
  {
  	char* proto = GetContactProto(hContact);
  	if (proto == NULL) return;
 @@ -918,12 +910,12 @@ void SmileyCategoryListType::AddContactTransportAsCategory(HANDLE hContact, cons  		mir_free(trsp);
 -		bkstring displayName = dbv.ptszVal;
 +		CMString displayName = dbv.ptszVal;
  		if (packname != NULL) {
  			char path[MAX_PATH];
  			mir_snprintf(path, sizeof(path), "Smileys\\nova\\%s.msl", packname);
 -			bkstring paths = A2T_SM(path), patha; 
 +			CMString paths = A2T_SM(path), patha; 
  			pathToAbsolute(paths, patha);
  			if (_taccess(patha.c_str(), 0) != 0) 
 @@ -939,11 +931,11 @@ void SmileyCategoryListType::AddContactTransportAsCategory(HANDLE hContact, cons  void SmileyCategoryListType::AddAllProtocolsAsCategory(void)
  {
 -	bkstring displayName = TranslateT("Standard");
 -	bkstring tname = _T("Standard");
 +	CMString displayName = TranslateT("Standard");
 +	CMString tname = _T("Standard");
  	AddCategory(tname, displayName, smcStd);
 -	const bkstring& defaultFile = GetSmileyCategory(tname)->GetFilename();
 +	const CMString& defaultFile = GetSmileyCategory(tname)->GetFilename();
  	unsigned lpcp = (unsigned)CallService(MS_LANGPACK_GETCODEPAGE, 0, 0);
 @@ -959,37 +951,35 @@ void SmileyCategoryListType::AddAllProtocolsAsCategory(void)  	for (HANDLE hContact = db_find_first(); hContact; hContact = db_find_next(hContact))
  		AddContactTransportAsCategory(hContact, defaultFile);
 -	bkstring cats;
 +	CMString cats;
  	opt.ReadCustomCategories(cats);
 -	bkstring::size_type cppv = 0; 
 -	for (;;)
 -	{
 -		bkstring::size_type cp = cats.find('#', cppv);
 -		if (cp != cats.npos)
 -		{
 -			displayName = cats.substr(cppv, cp - cppv);
 -			AddCategory(displayName, displayName, smcCustom, defaultFile);
 -			cppv = cp + 1;
 -		}
 -		else break;
 +	int cppv = 0; 
 +	for (;;) {
 +		int cp = cats.Find('#', cppv);
 +		if (cp == -1)
 +			break;
 +			
 +		displayName = cats.Mid(cppv, cp - cppv);
 +		AddCategory(displayName, displayName, smcCustom, defaultFile);
 +		cppv = cp + 1;
  	}
 -	if (cppv != cats.size())
 -	{
 -		displayName = cats.substr(cppv, cats.size() - cppv);
 +
 +	if (cppv != cats.GetLength()) {
 +		displayName = cats.Mid(cppv, cats.GetLength() - cppv);
  		AddCategory(displayName, displayName, smcCustom, defaultFile);
  	}
  }
 -SmileyLookup::SmileyLookup(const bkstring& str, const bool regexs, const int ind, const bkstring& smpt)
 +SmileyLookup::SmileyLookup(const CMString& str, const bool regexs, const int ind, const CMString& smpt)
  {
  	TCHAR msgtxt[1024];
  	m_ind = ind;
  	if (regexs)
  	{
 -		static const bkstring testString(_T("Test String"));
 +		static const CMString testString(_T("Test String"));
  		m_pattern = _TPattern::compile(str);
  		m_valid = m_pattern != NULL;
  		if (m_valid)
 @@ -1016,7 +1006,7 @@ SmileyLookup::SmileyLookup(const bkstring& str, const bool regexs, const int ind  	{
  		m_text = str;
  		m_pattern = NULL;
 -		m_valid = !str.empty();
 +		m_valid = !str.IsEmpty();
  	}
  }
 @@ -1027,33 +1017,30 @@ SmileyLookup::~SmileyLookup()  }
 -void SmileyLookup::find(const bkstring& str, SmileyLocVecType& smlcur, bool firstOnly) const
 +void SmileyLookup::Find(const CMString& str, SmileyLocVecType& smlcur, bool firstOnly) const
  {
  	if (!m_valid) return;
 -	if (m_text.empty())
 -	{
 +	if (m_text.IsEmpty()) {
  		_TMatcher* matcher = m_pattern->createTMatcher(str);
 -		while( matcher->findNextMatch())
 -		{
 -			bkstring::size_type st = matcher->getStartingIndex();
 -			bkstring::size_type sz = matcher->getEndingIndex() - st;
 -			if (sz != 0) 
 -			{
 +		while( matcher->findNextMatch()) {
 +			int st = matcher->getStartingIndex();
 +			int sz = matcher->getEndingIndex() - st;
 +			if (sz != 0) {
  				smlcur.insert(new SmileyLocType(st, sz));
 -				if (firstOnly && m_ind != -1) return;
 +				if (firstOnly && m_ind != -1)
 +					return;
  			}
  		}
  		delete matcher;
  	}
 -	else
 -	{
 +	else {
  		const TCHAR* pos = str.c_str();
 -		while( (pos = _tcsstr(pos, m_text.c_str())) != NULL )
 -		{
 -			smlcur.insert(new SmileyLocType(pos - str.c_str(), m_text.size()));
 -			pos += m_text.size();
 -			if (firstOnly && m_ind != -1) return;
 +		while( (pos = _tcsstr(pos, m_text.c_str())) != NULL ) {
 +			smlcur.insert(new SmileyLocType(pos - str.c_str(), m_text.GetLength()));
 +			pos += m_text.GetLength();
 +			if (firstOnly && m_ind != -1)
 +				return;
  		}
  	}
  }
 diff --git a/plugins/SmileyAdd/src/smileys.h b/plugins/SmileyAdd/src/smileys.h index ad0eb059bc..76b0dc0f12 100644 --- a/plugins/SmileyAdd/src/smileys.h +++ b/plugins/SmileyAdd/src/smileys.h @@ -39,24 +39,24 @@ protected:  	HICON m_SmileyIcon;
  	ImageBase* m_xepimg;
 -	bkstring m_filepath;
 +	CMString m_filepath;
  	void SetFlagsBit(unsigned flag, bool set)
  	{ if (set) m_flags |= flag; else m_flags &= ~flag; } 
  public:
 -	bkstring m_TriggerText;
 -	bkstring m_ToolText;
 -	bkstring m_InsertText;
 +	CMString m_TriggerText;
 +	CMString m_ToolText;
 +	CMString m_InsertText;
  	SmileyType(void);
  	~SmileyType();
 -	const bkstring& GetTriggerText(void) const { return m_TriggerText; }
 -	const bkstring& GetToolText(void) const { return m_ToolText; }
 -	const bkstring& GetInsertText(void) const { return m_InsertText; }
 -	const bkstring& GetFilePath(void) const { return m_filepath; }
 +	const CMString& GetTriggerText(void) const { return m_TriggerText; }
 +	const CMString& GetToolText(void) const { return m_ToolText; }
 +	const CMString& GetInsertText(void) const { return m_InsertText; }
 +	const CMString& GetFilePath(void) const { return m_filepath; }
  	bool IsHidden(void) const { return (m_flags & HiddenSmiley) != 0; }
  	bool IsRegEx(void) const { return (m_flags & RegExSmiley) != 0; }
 @@ -86,7 +86,7 @@ public:  	void SetImList(HIMAGELIST hImLst, long i);
 -	bool LoadFromResource(const bkstring& file, const int index);
 +	bool LoadFromResource(const CMString& file, const int index);
  	bool LoadFromImage(IStream* pStream);
  };
 @@ -123,7 +123,7 @@ private:  	_TPattern* m_pattern;
  	int m_ind;
 -	bkstring m_text;
 +	CMString m_text;
  	bool m_valid;
  public:
 @@ -136,11 +136,11 @@ public:  	typedef SMOBJLIST<SmileyLocType> SmileyLocVecType;
  	SmileyLookup() { m_ind = 0; m_valid = false; m_pattern = NULL; };
 -	SmileyLookup(const bkstring& str, const bool regexs, const int ind, const bkstring& smpt);
 +	SmileyLookup(const CMString& str, const bool regexs, const int ind, const CMString& smpt);
  	~SmileyLookup();
 -	void find(const bkstring& str, SmileyLocVecType& smlcur, bool firstOnly) const;
 -	int GetIndex(void) const { return m_ind; }
 +	void Find(const CMString& str, SmileyLocVecType& smlcur, bool firstOnly) const;
 +	int  GetIndex(void) const { return m_ind; }
  	bool IsValid(void) const { return m_valid; }
  };
 @@ -154,12 +154,12 @@ public:  	POINT selec, win;
  private:
 -	bkstring m_Filename;  //used as identification
 -	bkstring m_Name;
 -	bkstring m_Author;
 -	bkstring m_Date;
 -	bkstring m_Version;
 -	bkstring m_ButtonSmiley;
 +	CMString m_Filename;  //used as identification
 +	CMString m_Name;
 +	CMString m_Author;
 +	CMString m_Date;
 +	CMString m_Version;
 +	CMString m_ButtonSmiley;
  	HIMAGELIST m_hSmList;
 @@ -170,11 +170,11 @@ private:  	bool errorFound;
 -	void InsertLookup(SmileyType& sml, bkstring& lk, bool first);
 +	void InsertLookup(SmileyType& sml, CMString& lk, bool first);
  	void AddTriggersToSmileyLookup(void);
 -	void ReplaceAllSpecials(const bkstring& Input, bkstring& Output);
 -	bool LoadSmileyFileMSL(bkstring& tbuf, bool onlyInfo, bkstring& modpath);
 -	bool LoadSmileyFileXEP(bkstring& tbuf, bool onlyInfo, bkstring& modpath);
 +	void ReplaceAllSpecials(const CMString& Input, CMString& Output);
 +	bool LoadSmileyFileMSL(CMString& tbuf, bool onlyInfo, CMString& modpath);
 +	bool LoadSmileyFileXEP(CMString& tbuf, bool onlyInfo, CMString& modpath);
  public:
  	SmileyPackType();
 @@ -183,11 +183,11 @@ public:  	SmileyVectorType& GetSmileyList(void) { return m_SmileyList; }
  	SmileyLookupType* GetSmileyLookup(void) { return &m_SmileyLookup; }
 -	const bkstring& GetFilename(void) const { return m_Filename; }
 -	const bkstring& GetName(void) const { return m_Name; }
 -	const bkstring& GetAuthor(void) const { return m_Author; }
 -	const bkstring& GetDate(void) const { return m_Date; }
 -	const bkstring& GetVersion(void) const { return m_Version; }
 +	const CMString& GetFilename(void) const { return m_Filename; }
 +	const CMString& GetName(void) const { return m_Name; }
 +	const CMString& GetAuthor(void) const { return m_Author; }
 +	const CMString& GetDate(void) const { return m_Date; }
 +	const CMString& GetVersion(void) const { return m_Version; }
  	int SmileyCount(void) const { return m_SmileyList.getCount(); }
  	int VisibleSmileyCount(void) const { return m_VisibleCount; }
 @@ -196,7 +196,7 @@ public:  	const TCHAR* GetButtonSmiley(void) const { return m_ButtonSmiley.c_str(); }
 -	bool LoadSmileyFile(const bkstring& filename, bool onlyInfo, bool noerr = false);
 +	bool LoadSmileyFile(const CMString& filename, bool onlyInfo, bool noerr = false);
  	void Clear(void);
  };
 @@ -213,9 +213,9 @@ private:  public:
  	int NumberOfSmileyPacks(void) { return m_SmileyPacks.getCount(); }
 -	bool AddSmileyPack(bkstring& filename);
 +	bool AddSmileyPack(CMString& filename);
  	void ClearAndFreeAll(void);
 -	SmileyPackType* GetSmileyPack(bkstring& filename);
 +	SmileyPackType* GetSmileyPack(CMString& filename);
  };
 @@ -232,9 +232,9 @@ typedef enum  class SmileyCategoryType
  {
  private:
 -	bkstring m_Name;
 -	bkstring m_DisplayName;
 -	bkstring m_Filename;     //functions as identification 
 +	CMString m_Name;
 +	CMString m_DisplayName;
 +	CMString m_Filename;     //functions as identification 
  	SmcType type;
 @@ -242,12 +242,12 @@ private:  public:
  	SmileyCategoryType() { type = smcNone; m_pSmileyPackStore = NULL; };
 -	SmileyCategoryType(SmileyPackListType* pSPS, const bkstring& name, 
 -		const bkstring& displayName, const bkstring& defaultFilename, SmcType typ);
 +	SmileyCategoryType(SmileyPackListType* pSPS, const CMString& name, 
 +		const CMString& displayName, const CMString& defaultFilename, SmcType typ);
 -	const bkstring& GetDisplayName(void) const { return m_DisplayName; }
 -	const bkstring& GetName(void) const { return m_Name; }
 -	const bkstring& GetFilename(void) const { return m_Filename; }
 +	const CMString& GetDisplayName(void) const { return m_DisplayName; }
 +	const CMString& GetName(void) const { return m_Name; }
 +	const CMString& GetFilename(void) const { return m_Filename; }
  	bool IsCustom(void) { return type == smcCustom; }
  	bool IsProto(void)  { return type == smcProto;  }
 @@ -257,10 +257,10 @@ public:  	SmileyPackType* GetSmileyPack(void);
 -	void SetFilename(bkstring& name) { m_Filename = name; }
 -	void SetDisplayName(bkstring& name) { m_DisplayName = name; }
 +	void SetFilename(CMString& name) { m_Filename = name; }
 +	void SetDisplayName(CMString& name) { m_DisplayName = name; }
 -	void ClearFilename(void) { m_Filename.clear(); }
 +	void ClearFilename(void) { m_Filename.Empty(); }
  	void SaveSettings(void);
  	void Load(void);
 @@ -279,19 +279,19 @@ private:  public:  
  	void SetSmileyPackStore(SmileyPackListType* pSPS)  { m_pSmileyPackStore = pSPS; }
 -	SmileyCategoryType* GetSmileyCategory(const bkstring& name);
 +	SmileyCategoryType* GetSmileyCategory(const CMString& name);
  	SmileyCategoryType* GetSmileyCategory(unsigned index);
 -	SmileyPackType* GetSmileyPack(bkstring& name);
 +	SmileyPackType* GetSmileyPack(CMString& name);
  	SmileyCategoryVectorType* GetSmileyCategoryList(void) { return &m_SmileyCategories; };
  	int NumberOfSmileyCategories(void) { return m_SmileyCategories.getCount(); }
 -	void AddCategory(const bkstring& name, const bkstring& displayName, SmcType typ,
 -		const bkstring& defaultFilename = bkstring(_T("Smileys\\nova\\default.msl")));
 -	void AddAndLoad(const bkstring& name, const bkstring& displayName);
 +	void AddCategory(const CMString& name, const CMString& displayName, SmcType typ,
 +		const CMString& defaultFilename = CMString(_T("Smileys\\nova\\default.msl")));
 +	void AddAndLoad(const CMString& name, const CMString& displayName);
  	void AddAllProtocolsAsCategory(void); 
 -	void AddAccountAsCategory(PROTOACCOUNT *acc, const bkstring& defaultFile);
 -	void AddContactTransportAsCategory(HANDLE hContact, const bkstring& defaultFile);
 +	void AddAccountAsCategory(PROTOACCOUNT *acc, const CMString& defaultFile);
 +	void AddContactTransportAsCategory(HANDLE hContact, const CMString& defaultFile);
  	void ClearAndLoadAll(void);
  	void ClearAll(void) 
 diff --git a/plugins/SmileyAdd/src/smltool.cpp b/plugins/SmileyAdd/src/smltool.cpp index 6e1955332a..314a833547 100644 --- a/plugins/SmileyAdd/src/smltool.cpp +++ b/plugins/SmileyAdd/src/smltool.cpp @@ -203,7 +203,7 @@ void SmileyToolWindowType::InsertSmiley(void)  		}
  		else
  		{
 -			bkstring insertText;
 +			CMString insertText;
  			if (opt.SurroundSmileyWithSpaces) insertText = ' ';
  			insertText += sml->GetInsertText();
 @@ -245,7 +245,7 @@ void SmileyToolWindowType::SmileySel(int but)  			ti.hwnd = m_hwndDialog;
  			ti.uId = (UINT_PTR)m_hwndDialog;
 -			const bkstring& toolText = m_pSmileyPack->GetSmiley(m_CurrentHotTrack)->GetToolText();
 +			const CMString& toolText = m_pSmileyPack->GetSmiley(m_CurrentHotTrack)->GetToolText();
  			ti.lpszText = const_cast<TCHAR*>(toolText.c_str()); 
  			SendMessage(m_hToolTip, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti);
  			SendMessage(m_hToolTip, TTM_ACTIVATE, TRUE, 0);
 | 
