mirror of
https://github.com/tstack/lnav.git
synced 2024-09-11 13:05:51 +03:00
[coverity] some cleanup and add the chunky_index
This commit is contained in:
parent
2c46b0f07b
commit
ccf29b3bac
@ -2,3 +2,4 @@
|
|||||||
cmake_minimum_required (VERSION 2.6)
|
cmake_minimum_required (VERSION 2.6)
|
||||||
project (lnav)
|
project (lnav)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
add_subdirectory(test)
|
||||||
|
@ -68,6 +68,7 @@ set(diag_STAT_SRCS
|
|||||||
auto_pid.hh
|
auto_pid.hh
|
||||||
bottom_status_source.hh
|
bottom_status_source.hh
|
||||||
byte_array.hh
|
byte_array.hh
|
||||||
|
chunky_index.hh
|
||||||
concise_index.hh
|
concise_index.hh
|
||||||
column_namer.hh
|
column_namer.hh
|
||||||
format-text-files.hh
|
format-text-files.hh
|
||||||
|
@ -61,12 +61,12 @@ void scrub_ansi_string(std::string &str, string_attrs_t &sa)
|
|||||||
int attrs = 0;
|
int attrs = 0;
|
||||||
int bg = 0;
|
int bg = 0;
|
||||||
int fg = 0;
|
int fg = 0;
|
||||||
int lpc;
|
unsigned long lpc;
|
||||||
|
|
||||||
switch (pi.get_substr_start(&caps[2])[0]) {
|
switch (pi.get_substr_start(&caps[2])[0]) {
|
||||||
case 'm':
|
case 'm':
|
||||||
for (lpc = caps[1].c_begin;
|
for (lpc = (unsigned long) caps[1].c_begin;
|
||||||
lpc != (int)string::npos && lpc < caps[1].c_end; ) {
|
lpc != string::npos && lpc < caps[1].c_end; ) {
|
||||||
int ansi_code = 0;
|
int ansi_code = 0;
|
||||||
|
|
||||||
if (sscanf(&(str[lpc]), "%d", &ansi_code) == 1) {
|
if (sscanf(&(str[lpc]), "%d", &ansi_code) == 1) {
|
||||||
@ -111,11 +111,11 @@ void scrub_ansi_string(std::string &str, string_attrs_t &sa)
|
|||||||
|
|
||||||
case 'C':
|
case 'C':
|
||||||
{
|
{
|
||||||
int spaces = 0;
|
unsigned int spaces = 0;
|
||||||
|
|
||||||
if (sscanf(&(str[caps[1].c_begin]), "%d", &spaces) == 1 &&
|
if (sscanf(&(str[caps[1].c_begin]), "%u", &spaces) == 1 &&
|
||||||
spaces > 0) {
|
spaces > 0) {
|
||||||
str.insert(caps[0].c_end, spaces, ' ');
|
str.insert((unsigned long) caps[0].c_end, spaces, ' ');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -204,8 +204,6 @@ private:
|
|||||||
|
|
||||||
class auto_pipe {
|
class auto_pipe {
|
||||||
public:
|
public:
|
||||||
static const int STDIO_FD_COUNT = 3;
|
|
||||||
|
|
||||||
auto_pipe(int child_fd = -1, int child_flags = O_RDONLY)
|
auto_pipe(int child_fd = -1, int child_flags = O_RDONLY)
|
||||||
: ap_child_flags(child_flags), ap_child_fd(child_fd)
|
: ap_child_flags(child_flags), ap_child_fd(child_fd)
|
||||||
{
|
{
|
||||||
@ -238,7 +236,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void after_fork(pid_t child_pid) {
|
void after_fork(pid_t child_pid) {
|
||||||
int new_fd = -1;
|
int new_fd;
|
||||||
|
|
||||||
switch (child_pid) {
|
switch (child_pid) {
|
||||||
case -1:
|
case -1:
|
||||||
|
229
src/chunky_index.hh
Normal file
229
src/chunky_index.hh
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2014, Timothy Stack
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of Timothy Stack nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @file chunky_index.hh
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __chunky_index_hh
|
||||||
|
#define __chunky_index_hh
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "lnav_log.hh"
|
||||||
|
|
||||||
|
template<typename T, size_t CHUNK_SIZE = 4096>
|
||||||
|
class chunky_index {
|
||||||
|
|
||||||
|
public:
|
||||||
|
chunky_index() : ci_generation(0), ci_merge_chunk(NULL), ci_size(0) {
|
||||||
|
};
|
||||||
|
|
||||||
|
~chunky_index() {
|
||||||
|
this->clear();
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t size() const {
|
||||||
|
return this->ci_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t chunk_count() const {
|
||||||
|
return this->ci_completed_chunks.size();
|
||||||
|
};
|
||||||
|
|
||||||
|
T& operator[](size_t index) {
|
||||||
|
size_t chunk_index = index / CHUNK_SIZE;
|
||||||
|
assert(chunk_index < this->chunk_count());
|
||||||
|
struct chunk *target_chunk = this->ci_completed_chunks[chunk_index];
|
||||||
|
return target_chunk->c_body[index % CHUNK_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
while (!this->ci_completed_chunks.empty()) {
|
||||||
|
delete this->ci_completed_chunks.back();
|
||||||
|
this->ci_completed_chunks.pop_back();
|
||||||
|
}
|
||||||
|
while (!this->ci_pending_chunks.empty()) {
|
||||||
|
delete this->ci_pending_chunks.front();
|
||||||
|
this->ci_pending_chunks.pop_front();
|
||||||
|
}
|
||||||
|
if (this->ci_merge_chunk != NULL) {
|
||||||
|
delete this->ci_merge_chunk;
|
||||||
|
this->ci_merge_chunk = NULL;
|
||||||
|
}
|
||||||
|
this->ci_size = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
for (size_t lpc = 0; lpc < this->ci_completed_chunks.size(); lpc++) {
|
||||||
|
this->ci_pending_chunks.push_back(this->ci_completed_chunks[lpc]);
|
||||||
|
}
|
||||||
|
this->ci_completed_chunks.clear();
|
||||||
|
this->ci_generation += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Comparator>
|
||||||
|
void merge_value(const T &val, Comparator comparator) {
|
||||||
|
this->merge_up_to(&val, comparator);
|
||||||
|
this->ci_merge_chunk->push_back(val);
|
||||||
|
|
||||||
|
this->ci_size += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
void merge_value(const T &val) {
|
||||||
|
this->merge_value(val, less_comparator());
|
||||||
|
};
|
||||||
|
|
||||||
|
void finish() {
|
||||||
|
this->merge_up_to(NULL, null_comparator());
|
||||||
|
if (this->ci_merge_chunk != NULL) {
|
||||||
|
if (this->ci_merge_chunk->empty()) {
|
||||||
|
delete this->ci_merge_chunk;
|
||||||
|
this->ci_merge_chunk = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this->ci_completed_chunks.push_back(this->ci_merge_chunk);
|
||||||
|
this->ci_merge_chunk = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
void skip_chunks(const T *val) {
|
||||||
|
while (!this->ci_pending_chunks.empty() && this->ci_pending_chunks.front()->skippable(val)) {
|
||||||
|
struct chunk *skipped_chunk = this->ci_pending_chunks.front();
|
||||||
|
this->ci_pending_chunks.pop_front();
|
||||||
|
skipped_chunk->c_consumed = 0;
|
||||||
|
skipped_chunk->c_generation = this->ci_generation;
|
||||||
|
this->ci_completed_chunks.push_back(skipped_chunk);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct null_comparator {
|
||||||
|
int operator()(const T &val, const T &other) const {
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct less_comparator {
|
||||||
|
int operator()(const T &val, const T &other) const {
|
||||||
|
if (val < other) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else if (other < val) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Comparator>
|
||||||
|
void merge_up_to(const T *val, Comparator comparator) {
|
||||||
|
this->skip_chunks(val);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (this->ci_merge_chunk != NULL && this->ci_merge_chunk->full()) {
|
||||||
|
this->ci_completed_chunks.push_back(this->ci_merge_chunk);
|
||||||
|
this->ci_merge_chunk = NULL;
|
||||||
|
}
|
||||||
|
if (this->ci_merge_chunk == NULL) {
|
||||||
|
this->ci_merge_chunk = new chunk(this->ci_generation);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this->ci_pending_chunks.empty()) {
|
||||||
|
struct chunk *next_chunk = this->ci_pending_chunks.front();
|
||||||
|
while (((val == NULL) || (comparator(next_chunk->front(), *val) < 0)) &&
|
||||||
|
!this->ci_merge_chunk->full()) {
|
||||||
|
this->ci_merge_chunk->push_back(next_chunk->consume());
|
||||||
|
if (next_chunk->empty()) {
|
||||||
|
this->ci_pending_chunks.pop_front();
|
||||||
|
delete next_chunk;
|
||||||
|
if (!this->ci_pending_chunks.empty()) {
|
||||||
|
next_chunk = this->ci_pending_chunks.front();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (this->ci_merge_chunk->full());
|
||||||
|
};
|
||||||
|
|
||||||
|
struct chunk {
|
||||||
|
chunk(unsigned long gen) : c_generation(gen), c_consumed(0), c_used(0) { };
|
||||||
|
|
||||||
|
bool empty() const {
|
||||||
|
return this->c_consumed == this->c_used;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool full() const {
|
||||||
|
return this->c_used == CHUNK_SIZE;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool skippable(const T *val) const {
|
||||||
|
return this->c_consumed == 0 && this->full() && (
|
||||||
|
val == NULL || (this->back() <= *val));
|
||||||
|
};
|
||||||
|
|
||||||
|
const T &front() const {
|
||||||
|
return this->c_body[this->c_consumed];
|
||||||
|
};
|
||||||
|
|
||||||
|
const T &consume() {
|
||||||
|
this->c_consumed += 1;
|
||||||
|
return this->c_body[this->c_consumed - 1];
|
||||||
|
};
|
||||||
|
|
||||||
|
const T &back() const {
|
||||||
|
return this->c_body[this->c_used - 1];
|
||||||
|
};
|
||||||
|
|
||||||
|
void push_back(const T &val) {
|
||||||
|
this->c_body[this->c_used] = val;
|
||||||
|
this->c_used += 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned long c_generation;
|
||||||
|
T c_body[CHUNK_SIZE];
|
||||||
|
size_t c_consumed;
|
||||||
|
size_t c_used;
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned long ci_generation;
|
||||||
|
std::vector<struct chunk *> ci_completed_chunks;
|
||||||
|
struct chunk *ci_merge_chunk;
|
||||||
|
std::list<struct chunk *> ci_pending_chunks;
|
||||||
|
|
||||||
|
size_t ci_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -53,7 +53,7 @@ static int try_inet_pton(int p_len, const char *p, char *n)
|
|||||||
{
|
{
|
||||||
static int family[] = { AF_INET6, AF_INET, AF_MAX };
|
static int family[] = { AF_INET6, AF_INET, AF_MAX };
|
||||||
|
|
||||||
char buf[MAX_ADDR_LEN];
|
char buf[MAX_ADDR_LEN + 1];
|
||||||
int retval = AF_MAX;
|
int retval = AF_MAX;
|
||||||
|
|
||||||
strncpy(buf, p, p_len);
|
strncpy(buf, p, p_len);
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include <lnav_log.hh>
|
#include "lnav_log.hh"
|
||||||
|
|
||||||
class concise_index {
|
class concise_index {
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int lpc = len; lpc < BITS_PER_WORD; lpc++) {
|
for (uint64_t lpc = len; lpc < BITS_PER_WORD; lpc++) {
|
||||||
uint64_t mask = 1ULL << (len - 1);
|
uint64_t mask = 1ULL << (len - 1);
|
||||||
uint64_t bit_to_set_or_clear = (1ULL << lpc);
|
uint64_t bit_to_set_or_clear = (1ULL << lpc);
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ public:
|
|||||||
|
|
||||||
if ((v == 0ULL || v == ~0ULL) &&
|
if ((v == 0ULL || v == ~0ULL) &&
|
||||||
(this->is_rle(lit_or_rle_word) || this->ci_literal_size == 0)) {
|
(this->is_rle(lit_or_rle_word) || this->ci_literal_size == 0)) {
|
||||||
bool bv = v;
|
bool bv = (bool) v;
|
||||||
|
|
||||||
if (this->is_rle(lit_or_rle_word)) {
|
if (this->is_rle(lit_or_rle_word)) {
|
||||||
if (this->get_rle_value(lit_or_rle_word) == bv &&
|
if (this->get_rle_value(lit_or_rle_word) == bv &&
|
||||||
@ -267,7 +267,7 @@ public:
|
|||||||
return this->i_parent->get_rle_value(word);
|
return this->i_parent->get_rle_value(word);
|
||||||
}
|
}
|
||||||
|
|
||||||
return word & this->i_parent->bit_in_word(this->i_bit_index);
|
return (bool) (word & this->i_parent->bit_in_word(this->i_bit_index));
|
||||||
};
|
};
|
||||||
|
|
||||||
uint64_t get_word(size_t &valid_bits_out) const {
|
uint64_t get_word(size_t &valid_bits_out) const {
|
||||||
@ -367,11 +367,11 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool get_rle_value(uint64_t v) const {
|
bool get_rle_value(uint64_t v) const {
|
||||||
return (v & VAL_MASK);
|
return (bool) (v & VAL_MASK);
|
||||||
};
|
};
|
||||||
|
|
||||||
int pos_index(uint64_t v) const {
|
int pos_index(uint64_t v) const {
|
||||||
return (v & POS_MASK) >> (64 - 6 - 1);
|
return (int) ((v & POS_MASK) >> (64 - 6 - 1));
|
||||||
};
|
};
|
||||||
|
|
||||||
uint64_t run_length(uint64_t v) const {
|
uint64_t run_length(uint64_t v) const {
|
||||||
|
@ -640,11 +640,11 @@ private:
|
|||||||
|
|
||||||
if (pairs_out.size() == 1) {
|
if (pairs_out.size() == 1) {
|
||||||
element &pair = pairs_out.front();
|
element &pair = pairs_out.front();
|
||||||
element &value = pair.e_sub_elements->back();
|
element &evalue = pair.e_sub_elements->back();
|
||||||
|
|
||||||
if (value.e_token == DNT_VALUE &&
|
if (evalue.e_token == DNT_VALUE &&
|
||||||
value.e_sub_elements != NULL &&
|
evalue.e_sub_elements != NULL &&
|
||||||
value.e_sub_elements->size() > 1) {
|
evalue.e_sub_elements->size() > 1) {
|
||||||
element_list_t::iterator next_sub;
|
element_list_t::iterator next_sub;
|
||||||
|
|
||||||
next_sub = pair.e_sub_elements->begin();
|
next_sub = pair.e_sub_elements->begin();
|
||||||
@ -655,9 +655,9 @@ private:
|
|||||||
next_sub);
|
next_sub);
|
||||||
free_row.clear();
|
free_row.clear();
|
||||||
free_row.SPLICE(free_row.begin(),
|
free_row.SPLICE(free_row.begin(),
|
||||||
*value.e_sub_elements,
|
*evalue.e_sub_elements,
|
||||||
value.e_sub_elements->begin(),
|
evalue.e_sub_elements->begin(),
|
||||||
value.e_sub_elements->end());
|
evalue.e_sub_elements->end());
|
||||||
pairs_out.clear();
|
pairs_out.clear();
|
||||||
context.Init(0, 0);
|
context.Init(0, 0);
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ class data_scanner {
|
|||||||
public:
|
public:
|
||||||
static const char *token2name(data_token_t token);
|
static const char *token2name(data_token_t token);
|
||||||
|
|
||||||
data_scanner(const std::string &line, size_t off = 0, size_t len = -1)
|
data_scanner(const std::string &line, size_t off = 0, size_t len = (size_t) -1)
|
||||||
: ds_line(line),
|
: ds_line(line),
|
||||||
ds_pcre_input(ds_line.c_str(), off, len)
|
ds_pcre_input(ds_line.c_str(), off, len)
|
||||||
{
|
{
|
||||||
@ -115,7 +115,7 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
data_scanner(shared_buffer_ref &line, size_t off = 0, size_t len = -1)
|
data_scanner(shared_buffer_ref &line, size_t off = 0, size_t len = (size_t) -1)
|
||||||
: ds_sbr(line), ds_pcre_input(line.get_data(), off, len)
|
: ds_sbr(line), ds_pcre_input(line.get_data(), off, len)
|
||||||
{
|
{
|
||||||
if (line.length() > 0 && line.get_data()[line.length() - 1] == '.') {
|
if (line.length() > 0 && line.get_data()[line.length() - 1] == '.') {
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "sqlite3.h"
|
#include "sqlite3.h"
|
||||||
|
|
||||||
@ -60,17 +61,17 @@ static void sql_basename(sqlite3_context *context,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int lpc = strlen(path_in) - 1; lpc >= 0; lpc--) {
|
for (ssize_t lpc = strlen(path_in) - 1; lpc >= 0; lpc--) {
|
||||||
if (path_in[lpc] == '/' || path_in[lpc] == '\\') {
|
if (path_in[lpc] == '/' || path_in[lpc] == '\\') {
|
||||||
if (text_end != -1) {
|
if (text_end != -1) {
|
||||||
sqlite3_result_text(context,
|
sqlite3_result_text(context,
|
||||||
&path_in[lpc + 1], text_end - lpc - 1,
|
&path_in[lpc + 1], (int) (text_end - lpc - 1),
|
||||||
SQLITE_TRANSIENT);
|
SQLITE_TRANSIENT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (text_end == -1) {
|
else if (text_end == -1) {
|
||||||
text_end = lpc + 1;
|
text_end = (int) (lpc + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +89,7 @@ static void sql_dirname(sqlite3_context *context,
|
|||||||
int argc, sqlite3_value **argv)
|
int argc, sqlite3_value **argv)
|
||||||
{
|
{
|
||||||
const char *path_in;
|
const char *path_in;
|
||||||
int text_end;
|
ssize_t text_end;
|
||||||
|
|
||||||
if (sqlite3_value_type(argv[0]) == SQLITE_NULL) {
|
if (sqlite3_value_type(argv[0]) == SQLITE_NULL) {
|
||||||
sqlite3_result_null(context);
|
sqlite3_result_null(context);
|
||||||
@ -106,7 +107,7 @@ static void sql_dirname(sqlite3_context *context,
|
|||||||
while (text_end >= 0) {
|
while (text_end >= 0) {
|
||||||
if (path_in[text_end] == '/' || path_in[text_end] == '\\') {
|
if (path_in[text_end] == '/' || path_in[text_end] == '\\') {
|
||||||
sqlite3_result_text(context,
|
sqlite3_result_text(context,
|
||||||
path_in, text_end == 0 ? 1 : text_end,
|
path_in, (int) (text_end == 0 ? 1 : text_end),
|
||||||
SQLITE_TRANSIENT);
|
SQLITE_TRANSIENT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
#include <IOKit/IODataQueueClient.h>
|
||||||
|
|
||||||
#include "lnav_log.hh"
|
#include "lnav_log.hh"
|
||||||
#include "grep_proc.hh"
|
#include "grep_proc.hh"
|
||||||
@ -328,7 +329,7 @@ void grep_proc::check_fd_set(fd_set &ready_fds)
|
|||||||
|
|
||||||
if (this->gp_err_pipe != -1 && FD_ISSET(this->gp_err_pipe, &ready_fds)) {
|
if (this->gp_err_pipe != -1 && FD_ISSET(this->gp_err_pipe, &ready_fds)) {
|
||||||
char buffer[1024 + 1];
|
char buffer[1024 + 1];
|
||||||
int rc;
|
ssize_t rc;
|
||||||
|
|
||||||
rc = read(this->gp_err_pipe, buffer, sizeof(buffer) - 1);
|
rc = read(this->gp_err_pipe, buffer, sizeof(buffer) - 1);
|
||||||
if (rc > 0) {
|
if (rc > 0) {
|
||||||
|
@ -32,6 +32,8 @@
|
|||||||
#ifndef __grep_proc_hh
|
#ifndef __grep_proc_hh
|
||||||
#define __grep_proc_hh
|
#define __grep_proc_hh
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -108,7 +108,7 @@ private:
|
|||||||
unlink(lockname);
|
unlink(lockname);
|
||||||
};
|
};
|
||||||
|
|
||||||
int lh_fd;
|
auto_fd lh_fd;
|
||||||
};
|
};
|
||||||
/* XXX END */
|
/* XXX END */
|
||||||
|
|
||||||
|
@ -4409,7 +4409,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lnav_data.ld_file_names.empty() && !lnav_data.ld_flags & LNF_HELP) {
|
if (lnav_data.ld_file_names.empty() && !(lnav_data.ld_flags & LNF_HELP)) {
|
||||||
fprintf(stderr, "error: no log files given/found.\n");
|
fprintf(stderr, "error: no log files given/found.\n");
|
||||||
retval = EXIT_FAILURE;
|
retval = EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -243,9 +243,10 @@ const char *log_format::log_scanf(const char *line,
|
|||||||
{
|
{
|
||||||
int curr_fmt = -1;
|
int curr_fmt = -1;
|
||||||
const char * retval = NULL;
|
const char * retval = NULL;
|
||||||
|
bool done = false;
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
while (next_format(fmt, curr_fmt, this->lf_fmt_lock)) {
|
while (!done && next_format(fmt, curr_fmt, this->lf_fmt_lock)) {
|
||||||
va_start(args, tv_out);
|
va_start(args, tv_out);
|
||||||
int matches;
|
int matches;
|
||||||
|
|
||||||
@ -254,10 +255,8 @@ const char *log_format::log_scanf(const char *line,
|
|||||||
matches = vsscanf(line, fmt[curr_fmt], args);
|
matches = vsscanf(line, fmt[curr_fmt], args);
|
||||||
if (matches < expected_matches) {
|
if (matches < expected_matches) {
|
||||||
retval = NULL;
|
retval = NULL;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
else if (time_dest[0] == '\0') {
|
||||||
if (time_dest[0] == '\0') {
|
|
||||||
retval = NULL;
|
retval = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -265,7 +264,7 @@ const char *log_format::log_scanf(const char *line,
|
|||||||
|
|
||||||
if (retval) {
|
if (retval) {
|
||||||
this->lf_fmt_lock = curr_fmt;
|
this->lf_fmt_lock = curr_fmt;
|
||||||
break;
|
done = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ static int vt_open(sqlite3_vtab *p_svt, sqlite3_vtab_cursor **pp_cursor)
|
|||||||
|
|
||||||
p_vt->base.zErrMsg = NULL;
|
p_vt->base.zErrMsg = NULL;
|
||||||
|
|
||||||
vtab_cursor *p_cur = (vtab_cursor *)new vtab_cursor();
|
vtab_cursor *p_cur = new vtab_cursor();
|
||||||
|
|
||||||
*pp_cursor = (sqlite3_vtab_cursor *)p_cur;
|
*pp_cursor = (sqlite3_vtab_cursor *)p_cur;
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ static int vt_open(sqlite3_vtab *p_svt, sqlite3_vtab_cursor **pp_cursor)
|
|||||||
p_cur->log_cursor.lc_sub_index = 0;
|
p_cur->log_cursor.lc_sub_index = 0;
|
||||||
vt_next((sqlite3_vtab_cursor *)p_cur);
|
vt_next((sqlite3_vtab_cursor *)p_cur);
|
||||||
|
|
||||||
return p_cur ? SQLITE_OK : SQLITE_NOMEM;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vt_close(sqlite3_vtab_cursor *cur)
|
static int vt_close(sqlite3_vtab_cursor *cur)
|
||||||
|
@ -342,20 +342,6 @@ public:
|
|||||||
: ld_file(lf),
|
: ld_file(lf),
|
||||||
ld_lines_indexed(0) { };
|
ld_lines_indexed(0) { };
|
||||||
|
|
||||||
bool operator<(const logfile_data &rhs)
|
|
||||||
{
|
|
||||||
if (this->ld_file == rhs.ld_file) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (this->ld_file == NULL) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (this->ld_file != NULL) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return (*this->ld_file) < (*rhs.ld_file);
|
|
||||||
};
|
|
||||||
|
|
||||||
void clear(void)
|
void clear(void)
|
||||||
{
|
{
|
||||||
this->ld_file = NULL;
|
this->ld_file = NULL;
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <IOKit/IODataQueueClient.h>
|
||||||
|
|
||||||
#include "lnav_log.hh"
|
#include "lnav_log.hh"
|
||||||
#include "piper_proc.hh"
|
#include "piper_proc.hh"
|
||||||
@ -52,7 +53,7 @@ using namespace std;
|
|||||||
|
|
||||||
static const char *STDIN_EOF_MSG = "---- END-OF-STDIN ----";
|
static const char *STDIN_EOF_MSG = "---- END-OF-STDIN ----";
|
||||||
|
|
||||||
static int write_timestamp(int fd, off_t woff)
|
static ssize_t write_timestamp(int fd, off_t woff)
|
||||||
{
|
{
|
||||||
char time_str[64];
|
char time_str[64];
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
@ -79,15 +80,15 @@ piper_proc::piper_proc(int pipefd, bool timestamp, const char *filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char piper_tmpname[PATH_MAX];
|
char piper_tmpname[PATH_MAX];
|
||||||
const char *tmpdir;
|
const char *tmpdir;
|
||||||
|
|
||||||
if ((tmpdir = getenv("TMPDIR")) == NULL) {
|
if ((tmpdir = getenv("TMPDIR")) == NULL) {
|
||||||
tmpdir = _PATH_VARTMP;
|
tmpdir = _PATH_VARTMP;
|
||||||
}
|
}
|
||||||
snprintf(piper_tmpname, sizeof(piper_tmpname),
|
snprintf(piper_tmpname, sizeof(piper_tmpname),
|
||||||
"%s/lnav.piper.XXXXXX",
|
"%s/lnav.piper.XXXXXX",
|
||||||
tmpdir);
|
tmpdir);
|
||||||
if ((this->pp_fd = mkstemp(piper_tmpname)) == -1) {
|
if ((this->pp_fd = mkstemp(piper_tmpname)) == -1) {
|
||||||
throw error(errno);
|
throw error(errno);
|
||||||
}
|
}
|
||||||
@ -95,7 +96,7 @@ piper_proc::piper_proc(int pipefd, bool timestamp, const char *filename)
|
|||||||
unlink(piper_tmpname);
|
unlink(piper_tmpname);
|
||||||
}
|
}
|
||||||
|
|
||||||
fcntl(this->pp_fd, F_SETFD, FD_CLOEXEC);
|
fcntl(this->pp_fd.get(), F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
this->pp_child = fork();
|
this->pp_child = fork();
|
||||||
switch (this->pp_child) {
|
switch (this->pp_child) {
|
||||||
@ -123,7 +124,7 @@ piper_proc::piper_proc(int pipefd, bool timestamp, const char *filename)
|
|||||||
select(lb.get_fd() + 1, &rready, NULL, NULL, NULL);
|
select(lb.get_fd() + 1, &rready, NULL, NULL, NULL);
|
||||||
last_off = off;
|
last_off = off;
|
||||||
while (lb.read_line(off, lv, true)) {
|
while (lb.read_line(off, lv, true)) {
|
||||||
int wrc;
|
ssize_t wrc;
|
||||||
|
|
||||||
last_woff = woff;
|
last_woff = woff;
|
||||||
if (timestamp) {
|
if (timestamp) {
|
||||||
@ -154,7 +155,7 @@ piper_proc::piper_proc(int pipefd, bool timestamp, const char *filename)
|
|||||||
} while (lb.get_file_size() == (ssize_t)-1);
|
} while (lb.get_file_size() == (ssize_t)-1);
|
||||||
|
|
||||||
if (timestamp) {
|
if (timestamp) {
|
||||||
int wrc;
|
ssize_t wrc;
|
||||||
|
|
||||||
wrc = write_timestamp(this->pp_fd, woff);
|
wrc = write_timestamp(this->pp_fd, woff);
|
||||||
if (wrc == -1) {
|
if (wrc == -1) {
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include "auto_fd.hh"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a subprocess that reads data from a pipe and writes it to a file so
|
* Creates a subprocess that reads data from a pipe and writes it to a file so
|
||||||
@ -76,7 +77,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
/** A file descriptor that refers to the temporary file. */
|
/** A file descriptor that refers to the temporary file. */
|
||||||
int pp_fd;
|
auto_fd pp_fd;
|
||||||
|
|
||||||
/** The child process' pid. */
|
/** The child process' pid. */
|
||||||
pid_t pp_child;
|
pid_t pp_child;
|
||||||
|
@ -339,7 +339,7 @@ readline_curses::readline_curses()
|
|||||||
stifle_history(HISTORY_SIZE);
|
stifle_history(HISTORY_SIZE);
|
||||||
|
|
||||||
for (int lpc = 0; RL_INIT[lpc]; lpc++) {
|
for (int lpc = 0; RL_INIT[lpc]; lpc++) {
|
||||||
strcpy(buffer, RL_INIT[lpc]);
|
snprintf(buffer, sizeof(buffer), "%s", RL_INIT[lpc]);
|
||||||
rl_parse_and_bind(buffer); /* NOTE: buffer is modified */
|
rl_parse_and_bind(buffer); /* NOTE: buffer is modified */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
test/CMakeLists.txt
Normal file
4
test/CMakeLists.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
include_directories(../../lbuild/src ../src/)
|
||||||
|
|
||||||
|
add_executable(test_chunky_index test_chunky_index.cc)
|
@ -33,6 +33,7 @@ check_PROGRAMS = \
|
|||||||
test_auto_fd \
|
test_auto_fd \
|
||||||
test_auto_mem \
|
test_auto_mem \
|
||||||
test_bookmarks \
|
test_bookmarks \
|
||||||
|
test_chunky_index \
|
||||||
test_concise \
|
test_concise \
|
||||||
test_date_time_scanner \
|
test_date_time_scanner \
|
||||||
test_grep_proc2 \
|
test_grep_proc2 \
|
||||||
@ -62,6 +63,9 @@ test_auto_mem_SOURCES = test_auto_mem.cc
|
|||||||
test_bookmarks_SOURCES = test_bookmarks.cc
|
test_bookmarks_SOURCES = test_bookmarks.cc
|
||||||
test_bookmarks_LDADD = ../src/libdiag.a
|
test_bookmarks_LDADD = ../src/libdiag.a
|
||||||
|
|
||||||
|
test_chunky_index_SOURCES = test_chunky_index.cc
|
||||||
|
test_chunky_index_LDADD = ../src/libdiag.a
|
||||||
|
|
||||||
test_date_time_scanner_SOURCES = test_date_time_scanner.cc
|
test_date_time_scanner_SOURCES = test_date_time_scanner.cc
|
||||||
test_date_time_scanner_LDADD = ../src/libdiag.a $(SQLITE3_LIBS)
|
test_date_time_scanner_LDADD = ../src/libdiag.a $(SQLITE3_LIBS)
|
||||||
|
|
||||||
@ -235,6 +239,7 @@ TESTS = \
|
|||||||
test_auto_fd \
|
test_auto_fd \
|
||||||
test_auto_mem \
|
test_auto_mem \
|
||||||
test_bookmarks \
|
test_bookmarks \
|
||||||
|
test_chunky_index \
|
||||||
test_date_time_scanner \
|
test_date_time_scanner \
|
||||||
test_cmds.sh \
|
test_cmds.sh \
|
||||||
test_concise \
|
test_concise \
|
||||||
|
@ -88,16 +88,16 @@ check_PROGRAMS = drive_data_scanner$(EXEEXT) \
|
|||||||
drive_vt52_curses$(EXEEXT) drive_readline_curses$(EXEEXT) \
|
drive_vt52_curses$(EXEEXT) drive_readline_curses$(EXEEXT) \
|
||||||
slicer$(EXEEXT) scripty$(EXEEXT) test_ansi_scrubber$(EXEEXT) \
|
slicer$(EXEEXT) scripty$(EXEEXT) test_ansi_scrubber$(EXEEXT) \
|
||||||
test_auto_fd$(EXEEXT) test_auto_mem$(EXEEXT) \
|
test_auto_fd$(EXEEXT) test_auto_mem$(EXEEXT) \
|
||||||
test_bookmarks$(EXEEXT) test_concise$(EXEEXT) \
|
test_bookmarks$(EXEEXT) test_chunky_index$(EXEEXT) \
|
||||||
test_date_time_scanner$(EXEEXT) test_grep_proc2$(EXEEXT) \
|
test_concise$(EXEEXT) test_date_time_scanner$(EXEEXT) \
|
||||||
test_hist_source$(EXEEXT) test_json_ptr$(EXEEXT) \
|
test_grep_proc2$(EXEEXT) test_hist_source$(EXEEXT) \
|
||||||
test_line_buffer2$(EXEEXT) test_log_accel$(EXEEXT) \
|
test_json_ptr$(EXEEXT) test_line_buffer2$(EXEEXT) \
|
||||||
test_pcrepp$(EXEEXT) test_top_status$(EXEEXT) \
|
test_log_accel$(EXEEXT) test_pcrepp$(EXEEXT) \
|
||||||
test_yajlpp$(EXEEXT)
|
test_top_status$(EXEEXT) test_yajlpp$(EXEEXT)
|
||||||
TESTS = test_ansi_scrubber$(EXEEXT) test_auto_fd$(EXEEXT) \
|
TESTS = test_ansi_scrubber$(EXEEXT) test_auto_fd$(EXEEXT) \
|
||||||
test_auto_mem$(EXEEXT) test_bookmarks$(EXEEXT) \
|
test_auto_mem$(EXEEXT) test_bookmarks$(EXEEXT) \
|
||||||
test_date_time_scanner$(EXEEXT) test_cmds.sh \
|
test_chunky_index$(EXEEXT) test_date_time_scanner$(EXEEXT) \
|
||||||
test_concise$(EXEEXT) test_line_buffer2$(EXEEXT) \
|
test_cmds.sh test_concise$(EXEEXT) test_line_buffer2$(EXEEXT) \
|
||||||
test_line_buffer.sh test_listview.sh test_mvwattrline.sh \
|
test_line_buffer.sh test_listview.sh test_mvwattrline.sh \
|
||||||
test_grep_proc.sh test_grep_proc2$(EXEEXT) \
|
test_grep_proc.sh test_grep_proc2$(EXEEXT) \
|
||||||
test_hist_source$(EXEEXT) test_json_format.sh test_json_op.sh \
|
test_hist_source$(EXEEXT) test_json_format.sh test_json_op.sh \
|
||||||
@ -197,6 +197,9 @@ test_auto_mem_DEPENDENCIES =
|
|||||||
am_test_bookmarks_OBJECTS = test_bookmarks.$(OBJEXT)
|
am_test_bookmarks_OBJECTS = test_bookmarks.$(OBJEXT)
|
||||||
test_bookmarks_OBJECTS = $(am_test_bookmarks_OBJECTS)
|
test_bookmarks_OBJECTS = $(am_test_bookmarks_OBJECTS)
|
||||||
test_bookmarks_DEPENDENCIES = ../src/libdiag.a
|
test_bookmarks_DEPENDENCIES = ../src/libdiag.a
|
||||||
|
am_test_chunky_index_OBJECTS = test_chunky_index.$(OBJEXT)
|
||||||
|
test_chunky_index_OBJECTS = $(am_test_chunky_index_OBJECTS)
|
||||||
|
test_chunky_index_DEPENDENCIES = ../src/libdiag.a
|
||||||
am_test_concise_OBJECTS = test_concise.$(OBJEXT)
|
am_test_concise_OBJECTS = test_concise.$(OBJEXT)
|
||||||
test_concise_OBJECTS = $(am_test_concise_OBJECTS)
|
test_concise_OBJECTS = $(am_test_concise_OBJECTS)
|
||||||
test_concise_DEPENDENCIES = ../src/libdiag.a
|
test_concise_DEPENDENCIES = ../src/libdiag.a
|
||||||
@ -268,12 +271,12 @@ SOURCES = $(drive_data_scanner_SOURCES) $(drive_grep_proc_SOURCES) \
|
|||||||
$(drive_vt52_curses_SOURCES) $(scripty_SOURCES) \
|
$(drive_vt52_curses_SOURCES) $(scripty_SOURCES) \
|
||||||
$(slicer_SOURCES) $(test_ansi_scrubber_SOURCES) \
|
$(slicer_SOURCES) $(test_ansi_scrubber_SOURCES) \
|
||||||
$(test_auto_fd_SOURCES) $(test_auto_mem_SOURCES) \
|
$(test_auto_fd_SOURCES) $(test_auto_mem_SOURCES) \
|
||||||
$(test_bookmarks_SOURCES) $(test_concise_SOURCES) \
|
$(test_bookmarks_SOURCES) $(test_chunky_index_SOURCES) \
|
||||||
$(test_date_time_scanner_SOURCES) $(test_grep_proc2_SOURCES) \
|
$(test_concise_SOURCES) $(test_date_time_scanner_SOURCES) \
|
||||||
$(test_hist_source_SOURCES) $(test_json_ptr_SOURCES) \
|
$(test_grep_proc2_SOURCES) $(test_hist_source_SOURCES) \
|
||||||
$(test_line_buffer2_SOURCES) $(test_log_accel_SOURCES) \
|
$(test_json_ptr_SOURCES) $(test_line_buffer2_SOURCES) \
|
||||||
$(test_pcrepp_SOURCES) $(test_top_status_SOURCES) \
|
$(test_log_accel_SOURCES) $(test_pcrepp_SOURCES) \
|
||||||
$(test_yajlpp_SOURCES)
|
$(test_top_status_SOURCES) $(test_yajlpp_SOURCES)
|
||||||
DIST_SOURCES = $(drive_data_scanner_SOURCES) \
|
DIST_SOURCES = $(drive_data_scanner_SOURCES) \
|
||||||
$(drive_grep_proc_SOURCES) $(drive_json_op_SOURCES) \
|
$(drive_grep_proc_SOURCES) $(drive_json_op_SOURCES) \
|
||||||
$(drive_json_ptr_walk_SOURCES) $(drive_line_buffer_SOURCES) \
|
$(drive_json_ptr_walk_SOURCES) $(drive_line_buffer_SOURCES) \
|
||||||
@ -284,11 +287,12 @@ DIST_SOURCES = $(drive_data_scanner_SOURCES) \
|
|||||||
$(scripty_SOURCES) $(slicer_SOURCES) \
|
$(scripty_SOURCES) $(slicer_SOURCES) \
|
||||||
$(test_ansi_scrubber_SOURCES) $(test_auto_fd_SOURCES) \
|
$(test_ansi_scrubber_SOURCES) $(test_auto_fd_SOURCES) \
|
||||||
$(test_auto_mem_SOURCES) $(test_bookmarks_SOURCES) \
|
$(test_auto_mem_SOURCES) $(test_bookmarks_SOURCES) \
|
||||||
$(test_concise_SOURCES) $(test_date_time_scanner_SOURCES) \
|
$(test_chunky_index_SOURCES) $(test_concise_SOURCES) \
|
||||||
$(test_grep_proc2_SOURCES) $(test_hist_source_SOURCES) \
|
$(test_date_time_scanner_SOURCES) $(test_grep_proc2_SOURCES) \
|
||||||
$(test_json_ptr_SOURCES) $(test_line_buffer2_SOURCES) \
|
$(test_hist_source_SOURCES) $(test_json_ptr_SOURCES) \
|
||||||
$(test_log_accel_SOURCES) $(test_pcrepp_SOURCES) \
|
$(test_line_buffer2_SOURCES) $(test_log_accel_SOURCES) \
|
||||||
$(test_top_status_SOURCES) $(test_yajlpp_SOURCES)
|
$(test_pcrepp_SOURCES) $(test_top_status_SOURCES) \
|
||||||
|
$(test_yajlpp_SOURCES)
|
||||||
am__can_run_installinfo = \
|
am__can_run_installinfo = \
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
n|no|NO) false;; \
|
n|no|NO) false;; \
|
||||||
@ -662,6 +666,8 @@ test_auto_fd_LDADD = ../src/libdiag.a
|
|||||||
test_auto_mem_SOURCES = test_auto_mem.cc
|
test_auto_mem_SOURCES = test_auto_mem.cc
|
||||||
test_bookmarks_SOURCES = test_bookmarks.cc
|
test_bookmarks_SOURCES = test_bookmarks.cc
|
||||||
test_bookmarks_LDADD = ../src/libdiag.a
|
test_bookmarks_LDADD = ../src/libdiag.a
|
||||||
|
test_chunky_index_SOURCES = test_chunky_index.cc
|
||||||
|
test_chunky_index_LDADD = ../src/libdiag.a
|
||||||
test_date_time_scanner_SOURCES = test_date_time_scanner.cc
|
test_date_time_scanner_SOURCES = test_date_time_scanner.cc
|
||||||
test_date_time_scanner_LDADD = ../src/libdiag.a $(SQLITE3_LIBS)
|
test_date_time_scanner_LDADD = ../src/libdiag.a $(SQLITE3_LIBS)
|
||||||
test_grep_proc2_SOURCES = test_grep_proc2.cc
|
test_grep_proc2_SOURCES = test_grep_proc2.cc
|
||||||
@ -935,6 +941,10 @@ test_bookmarks$(EXEEXT): $(test_bookmarks_OBJECTS) $(test_bookmarks_DEPENDENCIES
|
|||||||
@rm -f test_bookmarks$(EXEEXT)
|
@rm -f test_bookmarks$(EXEEXT)
|
||||||
$(AM_V_CXXLD)$(CXXLINK) $(test_bookmarks_OBJECTS) $(test_bookmarks_LDADD) $(LIBS)
|
$(AM_V_CXXLD)$(CXXLINK) $(test_bookmarks_OBJECTS) $(test_bookmarks_LDADD) $(LIBS)
|
||||||
|
|
||||||
|
test_chunky_index$(EXEEXT): $(test_chunky_index_OBJECTS) $(test_chunky_index_DEPENDENCIES) $(EXTRA_test_chunky_index_DEPENDENCIES)
|
||||||
|
@rm -f test_chunky_index$(EXEEXT)
|
||||||
|
$(AM_V_CXXLD)$(CXXLINK) $(test_chunky_index_OBJECTS) $(test_chunky_index_LDADD) $(LIBS)
|
||||||
|
|
||||||
test_concise$(EXEEXT): $(test_concise_OBJECTS) $(test_concise_DEPENDENCIES) $(EXTRA_test_concise_DEPENDENCIES)
|
test_concise$(EXEEXT): $(test_concise_OBJECTS) $(test_concise_DEPENDENCIES) $(EXTRA_test_concise_DEPENDENCIES)
|
||||||
@rm -f test_concise$(EXEEXT)
|
@rm -f test_concise$(EXEEXT)
|
||||||
$(AM_V_CXXLD)$(CXXLINK) $(test_concise_OBJECTS) $(test_concise_LDADD) $(LIBS)
|
$(AM_V_CXXLD)$(CXXLINK) $(test_concise_OBJECTS) $(test_concise_LDADD) $(LIBS)
|
||||||
@ -1000,6 +1010,7 @@ distclean-compile:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_auto_fd.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_auto_fd.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_auto_mem.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_auto_mem.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bookmarks.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bookmarks.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_chunky_index.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_concise.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_concise.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_date_time_scanner.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_date_time_scanner.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_grep_proc2.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_grep_proc2.Po@am__quote@
|
||||||
@ -1248,6 +1259,13 @@ test_bookmarks.log: test_bookmarks$(EXEEXT)
|
|||||||
--log-file $$b.log --trs-file $$b.trs \
|
--log-file $$b.log --trs-file $$b.trs \
|
||||||
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||||
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||||
|
test_chunky_index.log: test_chunky_index$(EXEEXT)
|
||||||
|
@p='test_chunky_index$(EXEEXT)'; \
|
||||||
|
b='test_chunky_index'; \
|
||||||
|
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
|
||||||
|
--log-file $$b.log --trs-file $$b.trs \
|
||||||
|
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||||
|
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||||
test_date_time_scanner.log: test_date_time_scanner$(EXEEXT)
|
test_date_time_scanner.log: test_date_time_scanner$(EXEEXT)
|
||||||
@p='test_date_time_scanner$(EXEEXT)'; \
|
@p='test_date_time_scanner$(EXEEXT)'; \
|
||||||
b='test_date_time_scanner'; \
|
b='test_date_time_scanner'; \
|
||||||
|
97
test/test_chunky_index.cc
Normal file
97
test/test_chunky_index.cc
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "chunky_index.hh"
|
||||||
|
#include "../src/chunky_index.hh"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int retval = EXIT_SUCCESS;
|
||||||
|
|
||||||
|
{
|
||||||
|
chunky_index<int> ci;
|
||||||
|
|
||||||
|
ci.reset();
|
||||||
|
ci.finish();
|
||||||
|
assert(ci.chunk_count() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
chunky_index<int> ci;
|
||||||
|
|
||||||
|
ci.reset();
|
||||||
|
ci.merge_value(1);
|
||||||
|
ci.finish();
|
||||||
|
ci.reset();
|
||||||
|
ci.merge_value(2);
|
||||||
|
ci.finish();
|
||||||
|
|
||||||
|
assert(ci.size() == 2);
|
||||||
|
assert(ci[0] == 1);
|
||||||
|
assert(ci[1] == 2);
|
||||||
|
assert(ci.chunk_count() == 1);
|
||||||
|
|
||||||
|
ci.clear();
|
||||||
|
assert(ci.size() == 0);
|
||||||
|
assert(ci.chunk_count() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int expected[] = {0, 10, 11, 20, 30, 40, 50, 60, 70, 80, 90, 100};
|
||||||
|
chunky_index<int, 4> ci;
|
||||||
|
|
||||||
|
ci.reset();
|
||||||
|
for (int lpc = 0; lpc < 11; lpc++) {
|
||||||
|
ci.merge_value(lpc * 10);
|
||||||
|
}
|
||||||
|
ci.finish();
|
||||||
|
ci.reset();
|
||||||
|
ci.merge_value(11);
|
||||||
|
ci.finish();
|
||||||
|
for (int lpc = 0; lpc < 12; lpc++) {
|
||||||
|
assert(expected[lpc] == ci[lpc]);
|
||||||
|
}
|
||||||
|
assert(ci.chunk_count() == 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int expected[] = {0, 10, 20, 30, 40, 50, 51, 60, 70, 80, 90, 100};
|
||||||
|
chunky_index<int, 4> ci;
|
||||||
|
|
||||||
|
ci.reset();
|
||||||
|
for (int lpc = 0; lpc < 11; lpc++) {
|
||||||
|
ci.merge_value(lpc * 10);
|
||||||
|
}
|
||||||
|
ci.finish();
|
||||||
|
ci.reset();
|
||||||
|
ci.merge_value(51);
|
||||||
|
ci.finish();
|
||||||
|
for (int lpc = 0; lpc < 12; lpc++) {
|
||||||
|
assert(expected[lpc] == ci[lpc]);
|
||||||
|
}
|
||||||
|
assert(ci.chunk_count() == 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int expected[] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110};
|
||||||
|
chunky_index<int, 4> ci;
|
||||||
|
|
||||||
|
ci.reset();
|
||||||
|
for (int lpc = 0; lpc < 11; lpc++) {
|
||||||
|
ci.merge_value(lpc * 10);
|
||||||
|
}
|
||||||
|
ci.finish();
|
||||||
|
ci.reset();
|
||||||
|
ci.merge_value(110);
|
||||||
|
ci.finish();
|
||||||
|
for (int lpc = 0; lpc < 12; lpc++) {
|
||||||
|
assert(expected[lpc] == ci[lpc]);
|
||||||
|
}
|
||||||
|
assert(ci.chunk_count() == 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user