00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00031
00043 template<typename InputIterator1, typename InputIterator2>
00044 bool claw::glob_match
00045 ( InputIterator1 pattern_first, InputIterator1 pattern_last,
00046 InputIterator2 first, InputIterator2 last,
00047 typename InputIterator1::value_type any_sequence,
00048 typename InputIterator1::value_type zero_or_one,
00049 typename InputIterator1::value_type any )
00050 {
00051 bool result(false);
00052
00053 if ( (pattern_first == pattern_last) || (first == last) )
00054 {
00055 result = (first == last);
00056
00057 for ( ; result && (pattern_first != pattern_last); ++ pattern_first )
00058 result =
00059 (*pattern_first == any_sequence) || (*pattern_first == zero_or_one);
00060 }
00061 else if ( *pattern_first == any_sequence )
00062 result =
00063 glob_match
00064 ( pattern_first + 1, pattern_last, first, last, any_sequence, zero_or_one,
00065 any)
00066 || glob_match
00067 ( pattern_first, pattern_last, first + 1, last, any_sequence, zero_or_one,
00068 any );
00069 else if ( *pattern_first == zero_or_one )
00070 result =
00071 glob_match
00072 ( pattern_first + 1, pattern_last, first, last, any_sequence, zero_or_one,
00073 any)
00074 || glob_match
00075 ( pattern_first + 1, pattern_last, first + 1, last, any_sequence,
00076 zero_or_one, any );
00077 else if ( (*pattern_first == zero_or_one) || (*pattern_first == *first) )
00078 result =
00079 glob_match
00080 ( pattern_first + 1, pattern_last, first + 1, last, any_sequence,
00081 zero_or_one, any );
00082 else
00083 result = false;
00084
00085 return result;
00086 }
00087
00088
00100 template<typename InputIterator1, typename InputIterator2>
00101 bool claw::glob_potential_match
00102 ( InputIterator1 pattern_first, InputIterator1 pattern_last,
00103 InputIterator2 first, InputIterator2 last,
00104 typename InputIterator1::value_type any_sequence,
00105 typename InputIterator1::value_type zero_or_one,
00106 typename InputIterator1::value_type any )
00107 {
00108 bool result(true);
00109 bool stop(false);
00110
00111 while ( !stop && (pattern_first != pattern_last) && (first != last) )
00112 if ( (*pattern_first == any_sequence) || (*pattern_first == zero_or_one) )
00113 stop = true;
00114 else if ( *pattern_first == any )
00115 {
00116 ++pattern_first;
00117 ++first;
00118 }
00119 else if ( *pattern_first == *first )
00120 {
00121 ++pattern_first;
00122 ++first;
00123 }
00124 else
00125 {
00126 result = false;
00127 stop = true;
00128 }
00129
00130 return result;
00131 }