diff options
author | Adrian Kummerlaender | 2017-10-09 23:29:34 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2017-10-09 23:29:34 +0200 |
commit | 413195edd2990e0a9b4c3500360722cff76e1a0a (patch) | |
tree | 8058747833281e13527b85b50009b6e9ae75fc59 | |
parent | c7a82e67007aecb46315780b53a691a519d90513 (diff) | |
download | DictzipQuery-master.tar DictzipQuery-master.tar.gz DictzipQuery-master.tar.bz2 DictzipQuery-master.tar.lz DictzipQuery-master.tar.xz DictzipQuery-master.tar.zst DictzipQuery-master.zip |
-rw-r--r-- | src/util/query.cc | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/util/query.cc b/src/util/query.cc index f71b257..8b2b55c 100644 --- a/src/util/query.cc +++ b/src/util/query.cc @@ -15,12 +15,12 @@ std::vector<std::string> get_lines_starting_with( return std::vector<std::string>{}; } - posix_fadvise(fileno(file), 0, 0, 1); // FDADVICE_SEQUENTIAL std::vector<std::string> result; char buffer[16*1024 + 1]; char* start_of_match = nullptr; + std::string overlap; while ( std::size_t n = std::fread(buffer, sizeof(char), @@ -30,14 +30,24 @@ std::vector<std::string> get_lines_starting_with( (p = static_cast<char*>(std::memchr(p, '\n', (buffer + n) - p))); ++p ) { if ( start_of_match != nullptr ) { - result.emplace_back(start_of_match, p - start_of_match); - start_of_match = nullptr; + if ( overlap.empty() ) { + result.emplace_back(start_of_match, p - start_of_match); + start_of_match = nullptr; + } else { + result.emplace_back(overlap.append(buffer, p - buffer)); + start_of_match = nullptr; + overlap.clear(); + } } if ( std::strncmp(substring.c_str(), p+1, substring.size()) == 0 ) { start_of_match = p+1; } } + + if ( start_of_match != nullptr ) { + overlap = std::string(start_of_match, (buffer + n) - start_of_match); + } } std::fclose(file); |