You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvilib/irc/kvi_mirccntrl.cpp

308 lines
6.7 KiB

//
// 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;
}
}