Exemple #1
0
bool MatchTopicLink(const String& link, const Vector<String>& query)
{
	SyncTopicFile(link);
	int q = topic_info().Find(link);
	if(q < 0)
		return false;
	TopicInfo& f = topic_info()[q];
	for(int i = 0; i < query.GetCount(); i++)
		if(MatchWord(f.words, query[i]) < 0)
			return false;
	return true;
}
Exemple #2
0
// Returns the length of matched string
int CMatch::Match(ExpandTextRangeType etr, LPCWSTR asLine/*This may be NOT 0-terminated*/, int anLineLen/*Length of buffer*/, int anFrom/*Cursor pos*/)
{
	m_Type = etr_None;
	ms_Match.Empty();
	mn_Row = mn_Col = -1;
	ms_Protocol[0] = 0;
	mn_MatchLeft = mn_MatchRight = -1;
	mn_Start = mn_End = -1;

	if (!asLine || !*asLine || (anFrom < 0) || (anLineLen <= anFrom))
		return 0;

	if (!m_SrcLine.Set(asLine, anLineLen))
    	return 0;
	mn_SrcFrom = anFrom;
	mn_SrcLength = anLineLen;

	int iRc = 0;

	if (etr == etr_Word)
	{
		if (MatchWord(m_SrcLine.ms_Val, anLineLen, anFrom, mn_MatchLeft, mn_MatchRight))
		{
			_ASSERTE(mn_MatchRight >= mn_MatchLeft);
			iRc = (mn_MatchRight - mn_MatchLeft + 1);
			m_Type = etr_Word;
		}
	}
	else if (etr == etr_AnyClickable)
	{
		if (MatchAny())
		{
			_ASSERTE(mn_MatchRight >= mn_MatchLeft);
			_ASSERTE(m_Type != etr_None);
			iRc = (mn_MatchRight - mn_MatchLeft + 1);
		}
		else if (MatchFileNoExt())
		{
			_ASSERTE(mn_MatchRight >= mn_MatchLeft);
			_ASSERTE(m_Type == etr_File);
			iRc = (mn_MatchRight - mn_MatchLeft + 1);
		}
	}
	else
	{
		_ASSERTE(FALSE && "Unsupported etr argument value!");
	}

	return iRc;
}
Exemple #3
0
static int MatchOne( DaoRegex *self, DaoRgxItem *patt, daoint pos )
{
	DCharState st = { 0, 1, 0 };
	DCharState st2 = { 0, 1, 0 };
	uint_t ch, ch2, b1, b2;
	int i;

	patt->offset = 0;
	patt->count += 1;
	switch( patt->type ){
	case PAT_WBORDER : 
		if( pos == self->start || pos >= self->end ) return 1;
		for(i=1; i <= 4 && (pos-i) >= self->start; ++i){
			st = DString_DecodeChar( self->source + pos - i, self->source + self->end );
			if( i == 1 ) st2 = st;
			if( st.type == i ) break;
		}
		if( st.type == 0 ) st = st2;
		st2 = DString_DecodeChar( self->source + pos, self->source + self->end );
		if( dao_character( st.value ) != dao_character( st2.value ) ) return 1;
		return 0;
	case PAT_ANY :
		if( pos >= self->end ) return 0;
		st = DString_DecodeChar( self->source + pos, self->source + self->end );
		if( pos + st.width > self->end ) st.width = 1;
		patt->offset = st.width;
		return 1;
	case PAT_SPLIT:
	case PAT_BEGIN: case PAT_JOIN: return 1;
	case PAT_START: return (pos == self->start);
	case PAT_END : return (pos >= self->end);
	case PAT_SET  : return MatchSet(  self, patt, pos );
	case PAT_WORD : return MatchWord( self, patt, pos );
	case PAT_PAIR : return MatchPair( self, patt, pos );
	case PAT_PATPAIR : return MatchPatPair( self, patt, pos );
	case PAT_BACKREF: return MatchBackRef( self, patt, pos );
	default : break;
	}
	if( pos >= self->end ) return 0;

	st = DString_DecodeChar( self->source + pos, self->source + self->end );
	if( st.type == 0 ) return 0;

	patt->offset = st.width;
	ch = ch2 = st.value;
	if( sizeof(wchar_t) == 2 && ch > 0xFFFF ) ch = 0; /* for isw*(); */

	switch( patt->type ){
	case 'a' : return iswalpha( ch );
	case 's' : return iswspace( ch );
	case 'k' : return iswcntrl( ch );
	case 'p' : return iswpunct( ch );
	case 'd' : return iswdigit( ch );
	case 'x' : return iswxdigit( ch );
	case 'e' : return dao_cjk( ch2 );
	case 'w' : return dao_character( ch2 );
	case 'c' : return iswlower( ch );
	case 'A' : return ! iswalpha( ch );
	case 'S' : return ! iswspace( ch );
	case 'K' : return ! iswcntrl( ch );
	case 'P' : return ! iswpunct( ch );
	case 'D' : return ! iswdigit( ch );
	case 'X' : return ! iswxdigit( ch );
	case 'E' : return ! dao_cjk( ch2 );
	case 'W' : return ! dao_character( ch2 );
	case 'C' : return iswupper( ch );
	default : return 0;
	}
	return 0;
}