summaryrefslogtreecommitdiffstats
path: root/indexlib/tokenizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indexlib/tokenizer.cpp')
-rw-r--r--indexlib/tokenizer.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/indexlib/tokenizer.cpp b/indexlib/tokenizer.cpp
new file mode 100644
index 00000000..b069c748
--- /dev/null
+++ b/indexlib/tokenizer.cpp
@@ -0,0 +1,300 @@
+#include "tokenizer.h"
+#include <algorithm>
+#include <vector>
+#include <string>
+#include <cassert>
+
+using std::string;
+using std::vector;
+
+namespace {
+vector<string> split( const char* str, const char delim ) {
+ assert( str );
+ vector<string> res;
+ while ( *str == delim ) ++str;
+ while ( *str ) {
+ const char* start = str++;
+ while ( *str && *str != delim ) ++str;
+ res.push_back( string( start, str ) );
+ while ( *str == delim ) ++str;
+ }
+ return res;
+}
+
+class latin1_tokenizer : public indexlib::detail::tokenizer {
+ private:
+ static const char stop = 46; // .
+ static void normalize( char& c ) {
+ const char result[] = {
+ stop, // [ 0 ]
+ stop, // [ 1 ]
+ stop, // [ 2 ]
+ stop, // [ 3 ]
+ stop, // [ 4 ]
+ stop, // [ 5 ]
+ stop, // [ 6 ]
+ stop, // [ 7 ]
+ stop, // ^H [ 8 ]
+ stop, // \t [ 9 ]
+ stop, // [ 10 ]
+ stop, // [ 11 ]
+ stop, // [ 12 ]
+ stop, // [ 13 ]
+ stop, // [ 14 ]
+ stop, // [ 15 ]
+ stop, // [ 16 ]
+ stop, // [ 17 ]
+ stop, // [ 18 ]
+ stop, // [ 19 ]
+ stop, // [ 20 ]
+ stop, // [ 21 ]
+ stop, // [ 22 ]
+ stop, // [ 23 ]
+ stop, // [ 24 ]
+ stop, // [ 25 ]
+ stop, // [ 26 ]
+ stop, // [ 27 ]
+ stop, // [ 28 ]
+ stop, // [ 29 ]
+ stop, // [ 30 ]
+ stop, // [ 31 ]
+ stop, // [ 32 ]
+ stop, // ! [ 33 ]
+ stop, // " [ 34 ]
+ stop, // # [ 35 ]
+ stop, // $ [ 36 ]
+ stop, // % [ 37 ]
+ stop, // & [ 38 ]
+ stop, // ' [ 39 ]
+ stop, // ( [ 40 ]
+ stop, // ) [ 41 ]
+ stop, // * [ 42 ]
+ stop, // + [ 43 ]
+ stop, // , [ 44 ]
+ stop, // - [ 45 ]
+ stop, // . [ 46 ]
+ stop, // / [ 47 ]
+ '0', // 0 [ 48 ]
+ '1', // 1 [ 49 ]
+ '2', // 2 [ 50 ]
+ '3', // 3 [ 51 ]
+ '4', // 4 [ 52 ]
+ '5', // 5 [ 53 ]
+ '6', // 6 [ 54 ]
+ '7', // 7 [ 55 ]
+ '8', // 8 [ 56 ]
+ '9', // 9 [ 57 ]
+ stop, // : [ 58 ]
+ stop, // ; [ 59 ]
+ stop, // < [ 60 ]
+ stop, // = [ 61 ]
+ stop, // > [ 62 ]
+ stop, // ? [ 63 ]
+ stop, // @ [ 64 ]
+ 'A', // A [ 65 ]
+ 'B', // B [ 66 ]
+ 'C', // C [ 67 ]
+ 'D', // D [ 68 ]
+ 'E', // E [ 69 ]
+ 'F', // F [ 70 ]
+ 'G', // G [ 71 ]
+ 'H', // H [ 72 ]
+ 'I', // I [ 73 ]
+ 'J', // J [ 74 ]
+ 'K', // K [ 75 ]
+ 'L', // L [ 76 ]
+ 'M', // M [ 77 ]
+ 'N', // N [ 78 ]
+ 'O', // O [ 79 ]
+ 'P', // P [ 80 ]
+ 'Q', // Q [ 81 ]
+ 'R', // R [ 82 ]
+ 'S', // S [ 83 ]
+ 'T', // T [ 84 ]
+ 'U', // U [ 85 ]
+ 'V', // V [ 86 ]
+ 'W', // W [ 87 ]
+ 'X', // X [ 88 ]
+ 'Y', // Y [ 89 ]
+ 'Z', // Z [ 90 ]
+ stop, // [ [ 91 ]
+ stop, // \ [ 92 ]
+ stop, // ] [ 93 ]
+ stop, // ^ [ 94 ]
+ stop, // _ [ 95 ]
+ stop, // ` [ 96 ]
+ 'A', // a [ 97 ]
+ 'B', // b [ 98 ]
+ 'C', // c [ 99 ]
+ 'D', // d [ 100 ]
+ 'E', // e [ 101 ]
+ 'F', // f [ 102 ]
+ 'G', // g [ 103 ]
+ 'H', // h [ 104 ]
+ 'I', // i [ 105 ]
+ 'J', // j [ 106 ]
+ 'K', // k [ 107 ]
+ 'L', // l [ 108 ]
+ 'M', // m [ 109 ]
+ 'N', // n [ 110 ]
+ 'O', // o [ 111 ]
+ 'P', // p [ 112 ]
+ 'Q', // q [ 113 ]
+ 'R', // r [ 114 ]
+ 'S', // s [ 115 ]
+ 'T', // t [ 116 ]
+ 'U', // u [ 117 ]
+ 'V', // v [ 118 ]
+ 'W', // w [ 119 ]
+ 'X', // x [ 120 ]
+ 'Y', // y [ 121 ]
+ 'Z', // z [ 122 ]
+ stop, // { [ 123 ]
+ stop, // | [ 124 ]
+ stop, // } [ 125 ]
+ stop, // ~ [ 126 ]
+ stop, //  [ 127 ]
+ stop, // [ 128 ]
+ stop, // [ 129 ]
+ stop, // [ 130 ]
+ stop, // [ 131 ]
+ stop, // [ 132 ]
+ stop, // [ 133 ]
+ stop, // [ 134 ]
+ stop, // [ 135 ]
+ stop, // [ 136 ]
+ stop, // [ 137 ]
+ stop, // [ 138 ]
+ stop, // [ 139 ]
+ stop, // [ 140 ]
+ stop, // [ 141 ]
+ stop, // [ 142 ]
+ stop, // [ 143 ]
+ stop, // [ 144 ]
+ stop, // [ 145 ]
+ stop, // [ 146 ]
+ stop, // [ 147 ]
+ stop, // [ 148 ]
+ stop, // [ 149 ]
+ stop, // [ 150 ]
+ stop, // [ 151 ]
+ stop, // [ 152 ]
+ stop, // [ 153 ]
+ stop, // [ 154 ]
+ stop, // [ 155 ]
+ stop, // [ 156 ]
+ stop, // [ 157 ]
+ stop, // [ 158 ]
+ stop, // [ 159 ]
+ stop, // [ 160 ]
+ stop, // [ 161 ]
+ stop, // [ 162 ]
+ stop, // [ 163 ]
+ stop, // [ 164 ]
+ stop, // [ 165 ]
+ stop, // [ 166 ]
+ stop, // [ 167 ]
+ stop, // [ 168 ]
+ stop, // [ 169 ]
+ stop, // [ 170 ]
+ stop, // [ 171 ]
+ stop, // [ 172 ]
+ stop, // [ 173 ]
+ stop, // [ 174 ]
+ stop, // [ 175 ]
+ stop, // [ 176 ]
+ stop, // [ 177 ]
+ stop, // [ 178 ]
+ stop, // [ 179 ]
+ stop, // [ 180 ]
+ stop, // [ 181 ]
+ stop, // [ 182 ]
+ stop, // [ 183 ]
+ stop, // [ 184 ]
+ stop, // [ 185 ]
+ stop, // [ 186 ]
+ stop, // [ 187 ]
+ stop, // [ 188 ]
+ stop, // [ 189 ]
+ stop, // [ 190 ]
+ stop, // [ 191 ]
+ 'A', // [ 192 ]
+ 'A', // [ 193 ]
+ 'A', // [ 194 ]
+ 'A', // [ 195 ]
+ 'A', // [ 196 ]
+ 'A', // [ 197 ]
+ 'A', // [ 198 ]
+ 'C', // [ 199 ]
+ 'E', // [ 200 ]
+ 'E', // [ 201 ]
+ 'E', // [ 202 ]
+ 'E', // [ 203 ]
+ 'I', // [ 204 ]
+ 'I', // [ 205 ]
+ 'I', // [ 206 ]
+ 'I', // [ 207 ]
+ 'D', // [ 208 ]
+ 'N', // [ 209 ]
+ 'O', // [ 210 ]
+ 'O', // [ 211 ]
+ 'O', // [ 212 ]
+ 'O', // [ 213 ]
+ 'O', // [ 214 ]
+ 'X', // [ 215 ]
+ 'O', // [ 216 ]
+ 'U', // [ 217 ]
+ 'U', // [ 218 ]
+ 'U', // [ 219 ]
+ 'U', // [ 220 ]
+ 'Y', // [ 221 ]
+ 'T', // [ 222 ]
+ 'S', // [ 223 ]
+ 'A', // [ 224 ]
+ 'A', // [ 225 ]
+ 'A', // [ 226 ]
+ 'A', // [ 227 ]
+ 'A', // [ 228 ]
+ 'A', // [ 229 ]
+ 'A', // [ 230 ]
+ 'C', // [ 231 ]
+ 'E', // [ 232 ]
+ 'E', // [ 233 ]
+ 'E', // [ 234 ]
+ 'E', // [ 235 ]
+ 'I', // [ 236 ]
+ 'I', // [ 237 ]
+ 'I', // [ 238 ]
+ 'I', // [ 239 ]
+ stop, // [ 240 ]
+ 'N', // [ 241 ]
+ 'O', // [ 242 ]
+ 'O', // [ 243 ]
+ 'O', // [ 244 ]
+ 'O', // [ 245 ]
+ 'O', // [ 246 ]
+ stop, // [ 247 ]
+ 'O', // [ 248 ]
+ 'U', // [ 249 ]
+ 'U', // [ 250 ]
+ 'U', // [ 251 ]
+ 'U', // [ 252 ]
+ 'Y', // [ 253 ]
+ 'T', // [ 254 ]
+ 'Y' // [ 255 ]
+ };
+ c = result[ static_cast<unsigned char>( c ) ];
+ }
+ std::vector<std::string> do_string_to_words( const char* str ) {
+ string complete = str;
+ std::for_each( complete.begin(), complete.end(), normalize );
+ return split( complete.c_str(), stop );
+ }
+};
+}
+
+
+std::auto_ptr<indexlib::detail::tokenizer> indexlib::detail::get_tokenizer( std::string name ) {
+ if ( name == "latin-1:european" ) return std::auto_ptr<indexlib::detail::tokenizer>( new latin1_tokenizer );
+ return std::auto_ptr<indexlib::detail::tokenizer>( 0 );
+}