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