|
|
|
//
|
|
|
|
// File : kvi_mirccntrl.cpp
|
|
|
|
// Creation date : Sat Aug 31 17:07:36 2002 GMT by Szymon Stefanek
|
|
|
|
//
|
|
|
|
// This file is part of the KVirc irc client distribution
|
|
|
|
// Copyright (C) 2002 Szymon Stefanek (pragma at kvirc dot net)
|
|
|
|
//
|
|
|
|
// 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; either version 2
|
|
|
|
// of the License, or (at your opinion) any later version.
|
|
|
|
//
|
|
|
|
// 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, write to the Free Software Foundation,
|
|
|
|
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
//
|
|
|
|
|
|
|
|
#define __KVILIB__
|
|
|
|
|
|
|
|
#define _KVI_MIRCCNTRL_CPP_
|
|
|
|
|
|
|
|
#include "kvi_mirccntrl.h"
|
|
|
|
|
|
|
|
KVILIB_API const char * getColorBytes(const char *data_ptr,unsigned char *byte_1,unsigned char *byte_2)
|
|
|
|
{
|
|
|
|
//
|
|
|
|
// Scans the data_ptr for a mIrc color code XX,XX
|
|
|
|
// and fills the color values in the two bytes
|
|
|
|
//
|
|
|
|
|
|
|
|
//First we can have a digit or a coma
|
|
|
|
if(((*data_ptr >= '0') && (*data_ptr <='9')))
|
|
|
|
{
|
|
|
|
//Something interesting ok.
|
|
|
|
(*byte_1)=(*data_ptr)-'0'; //store the code
|
|
|
|
data_ptr++; //and check the next
|
|
|
|
if(((*data_ptr >= '0') && (*data_ptr <= '9'))||(*data_ptr==','))
|
|
|
|
{
|
|
|
|
//Yes we can understand it
|
|
|
|
if(*data_ptr==',')
|
|
|
|
{
|
|
|
|
//A coma , need to check for background
|
|
|
|
data_ptr++;
|
|
|
|
} else {
|
|
|
|
//A number
|
|
|
|
(*byte_1)=((((*byte_1)*10)+((*data_ptr)-'0'))%16);
|
|
|
|
data_ptr++;
|
|
|
|
if(*data_ptr==',')
|
|
|
|
{
|
|
|
|
//A coma , need to check for background
|
|
|
|
data_ptr++;
|
|
|
|
} else {
|
|
|
|
//Senseless return
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
//Senseless character control code OK and return
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
//Senseless character : only a CTRL+K code
|
|
|
|
(*byte_1)=KVI_NOCHANGE;
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
if((*data_ptr >= '0') && (*data_ptr <='9'))
|
|
|
|
{
|
|
|
|
//Background , a color code
|
|
|
|
(*byte_2)=(*data_ptr)-'0';
|
|
|
|
data_ptr++;
|
|
|
|
if((*data_ptr >= '0') && (*data_ptr <='9'))
|
|
|
|
{
|
|
|
|
(*byte_2)=((((*byte_2)*10)+((*data_ptr)-'0'))%16);
|
|
|
|
data_ptr++;
|
|
|
|
}
|
|
|
|
return data_ptr;
|
|
|
|
} else {
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr-1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
KVILIB_API const kvi_wchar_t * getColorBytesW(const kvi_wchar_t *data_ptr,unsigned char *byte_1,unsigned char *byte_2)
|
|
|
|
{
|
|
|
|
//
|
|
|
|
// Scans the data_ptr for a mIrc color code XX,XX
|
|
|
|
// and fills the color values in the two bytes
|
|
|
|
//
|
|
|
|
|
|
|
|
//First we can have a digit or a coma
|
|
|
|
if(((*data_ptr >= '0') && (*data_ptr <='9')))
|
|
|
|
{
|
|
|
|
//Something interesting ok.
|
|
|
|
(*byte_1)=((*data_ptr)-'0'); //store the code
|
|
|
|
data_ptr++; //and check the next
|
|
|
|
if(((*data_ptr >= '0') && (*data_ptr <= '9'))||(*data_ptr==','))
|
|
|
|
{
|
|
|
|
//Yes we can understand it
|
|
|
|
if(*data_ptr==',')
|
|
|
|
{
|
|
|
|
//A coma , need to check for background
|
|
|
|
data_ptr++;
|
|
|
|
} else {
|
|
|
|
//A number
|
|
|
|
//(*byte_1)=((((*byte_1)*10)+((*data_ptr)-'0'))%16);
|
|
|
|
(*byte_1)=((*byte_1)*10)+((*data_ptr)-'0');
|
|
|
|
data_ptr++;
|
|
|
|
if(*data_ptr==',')
|
|
|
|
{
|
|
|
|
//A coma , need to check for background
|
|
|
|
data_ptr++;
|
|
|
|
} else {
|
|
|
|
//Senseless return
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
//Senseless character control code OK and return
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
//Senseless character : only a CTRL+K code
|
|
|
|
(*byte_1)=KVI_NOCHANGE;
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
if((*data_ptr >= '0') && (*data_ptr <='9'))
|
|
|
|
{
|
|
|
|
//Background , a color code
|
|
|
|
(*byte_2)=(*data_ptr)-'0';
|
|
|
|
data_ptr++;
|
|
|
|
if((*data_ptr >= '0') && (*data_ptr <='9'))
|
|
|
|
{
|
|
|
|
//(*byte_2)=((((*byte_2)*10)+((*data_ptr)-'0'))%16);
|
|
|
|
(*byte_2)=((*byte_2)*10)+((*data_ptr)-'0');
|
|
|
|
data_ptr++;
|
|
|
|
}
|
|
|
|
return data_ptr;
|
|
|
|
} else {
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return data_ptr-1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
KVILIB_API unsigned int getUnicodeColorBytes(const TQString &szData,unsigned int charIdx,unsigned char *byte_1,unsigned char *byte_2)
|
|
|
|
{
|
|
|
|
//
|
|
|
|
// Scans the szData for a mIrc color code XX,XX
|
|
|
|
// and fills the color values in the two bytes
|
|
|
|
//
|
|
|
|
|
|
|
|
if(charIdx >= szData.length())
|
|
|
|
{
|
|
|
|
(*byte_1)=KVI_NOCHANGE;
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned short c = szData[(int)charIdx].tqunicode();
|
|
|
|
|
|
|
|
//First we can have a digit or a coma
|
|
|
|
if(((c < '0') || (c > '9')))
|
|
|
|
{
|
|
|
|
// senseless : only a CTRL+K code
|
|
|
|
(*byte_1)=KVI_NOCHANGE;
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Something interesting ok.
|
|
|
|
(*byte_1)=c - '0'; //store the code
|
|
|
|
charIdx++;
|
|
|
|
if(charIdx >= szData.length())
|
|
|
|
{
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
c = szData[(int)charIdx].tqunicode();
|
|
|
|
|
|
|
|
if(((c < '0') || (c > '9')) && (c != ','))
|
|
|
|
{
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if((c >= '0') && (c <= '9'))
|
|
|
|
{
|
|
|
|
(*byte_1)=(((*byte_1)*10)+(c-'0'))%16;
|
|
|
|
charIdx++;
|
|
|
|
if(charIdx >= szData.length())
|
|
|
|
{
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
c = szData[(int)charIdx].tqunicode();
|
|
|
|
}
|
|
|
|
|
|
|
|
if(c == ',')
|
|
|
|
{
|
|
|
|
charIdx++;
|
|
|
|
if(charIdx >= szData.length())
|
|
|
|
{
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
c = szData[(int)charIdx].tqunicode();
|
|
|
|
} else {
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
if((c < '0') || (c > '9'))
|
|
|
|
{
|
|
|
|
(*byte_2)=KVI_NOCHANGE;
|
|
|
|
if(szData[(int)(charIdx-1)].tqunicode()==',')
|
|
|
|
return charIdx-1;
|
|
|
|
else
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Background , a color code
|
|
|
|
(*byte_2)=c-'0';
|
|
|
|
charIdx++;
|
|
|
|
if(charIdx >= szData.length())return charIdx;
|
|
|
|
c = szData[(int)charIdx].tqunicode();
|
|
|
|
|
|
|
|
if((c >= '0') && (c <='9'))
|
|
|
|
{
|
|
|
|
(*byte_2)=(((*byte_2)*10)+(c-'0'))%16;
|
|
|
|
charIdx++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return charIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
namespace KviMircCntrl
|
|
|
|
{
|
|
|
|
TQString stripControlBytes(const TQString &szData)
|
|
|
|
{
|
|
|
|
TQString ret;
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
int l = szData.length();
|
|
|
|
int begin = 0;
|
|
|
|
unsigned char b1;
|
|
|
|
unsigned char b2;
|
|
|
|
while(i < l)
|
|
|
|
{
|
|
|
|
switch(szData[i].tqunicode())
|
|
|
|
{
|
|
|
|
case KVI_TEXT_UNDERLINE:
|
|
|
|
case KVI_TEXT_BOLD:
|
|
|
|
case KVI_TEXT_RESET:
|
|
|
|
case KVI_TEXT_REVERSE:
|
|
|
|
case KVI_TEXT_CRYPTESCAPE:
|
|
|
|
case KVI_TEXT_CTCP:
|
|
|
|
if(i != begin)
|
|
|
|
ret += szData.mid(begin,i - begin);
|
|
|
|
i++;
|
|
|
|
begin = i;
|
|
|
|
break;
|
|
|
|
case KVI_TEXT_COLOR:
|
|
|
|
if(i != begin)
|
|
|
|
ret += szData.mid(begin,i - begin);
|
|
|
|
i++;
|
|
|
|
i = getUnicodeColorBytes(szData,i,&b1,&b2);
|
|
|
|
begin = i;
|
|
|
|
break;
|
|
|
|
case KVI_TEXT_ICON:
|
|
|
|
if(i != begin)
|
|
|
|
ret += szData.mid(begin,i - begin);
|
|
|
|
i++;
|
|
|
|
while(i < l)
|
|
|
|
{
|
|
|
|
if(szData[i].tqunicode() == ' ')break;
|
|
|
|
else i++;
|
|
|
|
}
|
|
|
|
begin = i;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(i != begin)
|
|
|
|
ret += szData.mid(begin,i - begin);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|