1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
/*
Darts -- Double-ARray Trie System
$Id: mkdarts.cpp 1674 2008-03-22 11:21:34Z taku $;
Copyright(C) 2001-2007 Taku Kudo <taku@chasen.org>
All rights reserved.
*/
#include <darts.h>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
int progress_bar(size_t current, size_t total) {
static char bar[] = "*******************************************";
static int scale = sizeof(bar) - 1;
static int prev = 0;
int cur_percentage = static_cast<int>(100.0 * current/total);
int bar_len = static_cast<int>(1.0 * current*scale/total);
if (prev != cur_percentage) {
printf("Making Double Array: %3d%% |%.*s%*s| ",
cur_percentage, bar_len, bar, scale - bar_len, "");
if (cur_percentage == 100) printf("\n");
else printf("\r");
fflush(stdout);
}
prev = cur_percentage;
return 1;
};
int main(int argc, char **argv) {
if (argc < 3) {
std::cerr << "Usage: " << argv[0] << " File Index" << std::endl;
return -1;
}
std::string file = argv[argc-2];
std::string index = argv[argc-1];
Darts::DoubleArray da;
std::vector<const char *> key;
std::istream *is;
if (file == "-") {
is = &std::cin;
} else {
is = new std::ifstream(file.c_str());
}
if (!*is) {
std::cerr << "Cannot Open: " << file << std::endl;
return -1;
}
std::string line;
while (std::getline(*is, line)) {
char *tmp = new char[line.size()+1];
std::strcpy(tmp, line.c_str());
key.push_back(tmp);
}
if (file != "-") delete is;
if (da.build(key.size(), &key[0], 0, 0, &progress_bar) != 0
|| da.save(index.c_str()) != 0) {
std::cerr << "Error: cannot build double array " << file << std::endl;
return -1;
};
for (unsigned int i = 0; i < key.size(); i++)
delete [] key[i];
std::cout << "Done!, Compression Ratio: " <<
100.0 * da.nonzero_size() / da.size() << " %" << std::endl;
return 0;
}
|