mirror of
https://github.com/tstack/lnav.git
synced 2024-08-17 00:40:30 +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)
|
||||
project (lnav)
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(test)
|
||||
|
@ -68,6 +68,7 @@ set(diag_STAT_SRCS
|
||||
auto_pid.hh
|
||||
bottom_status_source.hh
|
||||
byte_array.hh
|
||||
chunky_index.hh
|
||||
concise_index.hh
|
||||
column_namer.hh
|
||||
format-text-files.hh
|
||||
|
@ -61,12 +61,12 @@ void scrub_ansi_string(std::string &str, string_attrs_t &sa)
|
||||
int attrs = 0;
|
||||
int bg = 0;
|
||||
int fg = 0;
|
||||
int lpc;
|
||||
unsigned long lpc;
|
||||
|
||||
switch (pi.get_substr_start(&caps[2])[0]) {
|
||||
case 'm':
|
||||
for (lpc = caps[1].c_begin;
|
||||
lpc != (int)string::npos && lpc < caps[1].c_end; ) {
|
||||
for (lpc = (unsigned long) caps[1].c_begin;
|
||||
lpc != string::npos && lpc < caps[1].c_end; ) {
|
||||
int ansi_code = 0;
|
||||
|
||||
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':
|
||||
{
|
||||
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) {
|
||||
str.insert(caps[0].c_end, spaces, ' ');
|
||||
str.insert((unsigned long) caps[0].c_end, spaces, ' ');
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -204,8 +204,6 @@ private:
|
||||
|
||||
class auto_pipe {
|
||||
public:
|
||||
static const int STDIO_FD_COUNT = 3;
|
||||
|
||||
auto_pipe(int child_fd = -1, int child_flags = O_RDONLY)
|
||||
: ap_child_flags(child_flags), ap_child_fd(child_fd)
|
||||
{
|
||||
@ -238,7 +236,7 @@ public:
|
||||
};
|
||||
|
||||
void after_fork(pid_t child_pid) {
|
||||
int new_fd = -1;
|
||||
int new_fd;
|
||||
|
||||
switch (child_pid) {
|
||||
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 };
|
||||
|
||||
char buf[MAX_ADDR_LEN];
|
||||
char buf[MAX_ADDR_LEN + 1];
|
||||
int retval = AF_MAX;
|
||||
|
||||
strncpy(buf, p, p_len);
|
||||
|
@ -36,7 +36,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <lnav_log.hh>
|
||||
#include "lnav_log.hh"
|
||||
|
||||
class concise_index {
|
||||
|
||||
@ -112,7 +112,7 @@ public:
|
||||
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 bit_to_set_or_clear = (1ULL << lpc);
|
||||
|
||||
@ -125,7 +125,7 @@ public:
|
||||
|
||||
if ((v == 0ULL || v == ~0ULL) &&
|
||||
(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->get_rle_value(lit_or_rle_word) == bv &&
|
||||
@ -267,7 +267,7 @@ public:
|
||||
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 {
|
||||
@ -367,11 +367,11 @@ public:
|
||||
};
|
||||
|
||||
bool get_rle_value(uint64_t v) const {
|
||||
return (v & VAL_MASK);
|
||||
return (bool) (v & VAL_MASK);
|
||||
};
|
||||
|
||||
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 {
|
||||
|
@ -640,11 +640,11 @@ private:
|
||||
|
||||
if (pairs_out.size() == 1) {
|
||||
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 &&
|
||||
value.e_sub_elements != NULL &&
|
||||
value.e_sub_elements->size() > 1) {
|
||||
if (evalue.e_token == DNT_VALUE &&
|
||||
evalue.e_sub_elements != NULL &&
|
||||
evalue.e_sub_elements->size() > 1) {
|
||||
element_list_t::iterator next_sub;
|
||||
|
||||
next_sub = pair.e_sub_elements->begin();
|
||||
@ -655,9 +655,9 @@ private:
|
||||
next_sub);
|
||||
free_row.clear();
|
||||
free_row.SPLICE(free_row.begin(),
|
||||
*value.e_sub_elements,
|
||||
value.e_sub_elements->begin(),
|
||||
value.e_sub_elements->end());
|
||||
*evalue.e_sub_elements,
|
||||
evalue.e_sub_elements->begin(),
|
||||
evalue.e_sub_elements->end());
|
||||
pairs_out.clear();
|
||||
context.Init(0, 0);
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ class data_scanner {
|
||||
public:
|
||||
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_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)
|
||||
{
|
||||
if (line.length() > 0 && line.get_data()[line.length() - 1] == '.') {
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include <string>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "sqlite3.h"
|
||||
|
||||
@ -60,17 +61,17 @@ static void sql_basename(sqlite3_context *context,
|
||||
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 (text_end != -1) {
|
||||
sqlite3_result_text(context,
|
||||
&path_in[lpc + 1], text_end - lpc - 1,
|
||||
&path_in[lpc + 1], (int) (text_end - lpc - 1),
|
||||
SQLITE_TRANSIENT);
|
||||
return;
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
const char *path_in;
|
||||
int text_end;
|
||||
ssize_t text_end;
|
||||
|
||||
if (sqlite3_value_type(argv[0]) == SQLITE_NULL) {
|
||||
sqlite3_result_null(context);
|
||||
@ -106,7 +107,7 @@ static void sql_dirname(sqlite3_context *context,
|
||||
while (text_end >= 0) {
|
||||
if (path_in[text_end] == '/' || path_in[text_end] == '\\') {
|
||||
sqlite3_result_text(context,
|
||||
path_in, text_end == 0 ? 1 : text_end,
|
||||
path_in, (int) (text_end == 0 ? 1 : text_end),
|
||||
SQLITE_TRANSIENT);
|
||||
return;
|
||||
}
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <signal.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <IOKit/IODataQueueClient.h>
|
||||
|
||||
#include "lnav_log.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)) {
|
||||
char buffer[1024 + 1];
|
||||
int rc;
|
||||
ssize_t rc;
|
||||
|
||||
rc = read(this->gp_err_pipe, buffer, sizeof(buffer) - 1);
|
||||
if (rc > 0) {
|
||||
|
@ -32,6 +32,8 @@
|
||||
#ifndef __grep_proc_hh
|
||||
#define __grep_proc_hh
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -108,7 +108,7 @@ private:
|
||||
unlink(lockname);
|
||||
};
|
||||
|
||||
int lh_fd;
|
||||
auto_fd lh_fd;
|
||||
};
|
||||
/* 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");
|
||||
retval = EXIT_FAILURE;
|
||||
}
|
||||
|
@ -243,9 +243,10 @@ const char *log_format::log_scanf(const char *line,
|
||||
{
|
||||
int curr_fmt = -1;
|
||||
const char * retval = NULL;
|
||||
bool done = false;
|
||||
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);
|
||||
int matches;
|
||||
|
||||
@ -254,10 +255,8 @@ const char *log_format::log_scanf(const char *line,
|
||||
matches = vsscanf(line, fmt[curr_fmt], args);
|
||||
if (matches < expected_matches) {
|
||||
retval = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (time_dest[0] == '\0') {
|
||||
else if (time_dest[0] == '\0') {
|
||||
retval = NULL;
|
||||
}
|
||||
else {
|
||||
@ -265,7 +264,7 @@ const char *log_format::log_scanf(const char *line,
|
||||
|
||||
if (retval) {
|
||||
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;
|
||||
|
||||
vtab_cursor *p_cur = (vtab_cursor *)new vtab_cursor();
|
||||
vtab_cursor *p_cur = new vtab_cursor();
|
||||
|
||||
*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;
|
||||
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)
|
||||
|
@ -342,20 +342,6 @@ public:
|
||||
: ld_file(lf),
|
||||
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)
|
||||
{
|
||||
this->ld_file = NULL;
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <IOKit/IODataQueueClient.h>
|
||||
|
||||
#include "lnav_log.hh"
|
||||
#include "piper_proc.hh"
|
||||
@ -52,7 +53,7 @@ using namespace std;
|
||||
|
||||
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];
|
||||
struct timeval tv;
|
||||
@ -79,15 +80,15 @@ piper_proc::piper_proc(int pipefd, bool timestamp, const char *filename)
|
||||
}
|
||||
}
|
||||
else {
|
||||
char piper_tmpname[PATH_MAX];
|
||||
char piper_tmpname[PATH_MAX];
|
||||
const char *tmpdir;
|
||||
|
||||
if ((tmpdir = getenv("TMPDIR")) == NULL) {
|
||||
tmpdir = _PATH_VARTMP;
|
||||
}
|
||||
snprintf(piper_tmpname, sizeof(piper_tmpname),
|
||||
"%s/lnav.piper.XXXXXX",
|
||||
tmpdir);
|
||||
"%s/lnav.piper.XXXXXX",
|
||||
tmpdir);
|
||||
if ((this->pp_fd = mkstemp(piper_tmpname)) == -1) {
|
||||
throw error(errno);
|
||||
}
|
||||
@ -95,7 +96,7 @@ piper_proc::piper_proc(int pipefd, bool timestamp, const char *filename)
|
||||
unlink(piper_tmpname);
|
||||
}
|
||||
|
||||
fcntl(this->pp_fd, F_SETFD, FD_CLOEXEC);
|
||||
fcntl(this->pp_fd.get(), F_SETFD, FD_CLOEXEC);
|
||||
|
||||
this->pp_child = fork();
|
||||
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);
|
||||
last_off = off;
|
||||
while (lb.read_line(off, lv, true)) {
|
||||
int wrc;
|
||||
ssize_t wrc;
|
||||
|
||||
last_woff = woff;
|
||||
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);
|
||||
|
||||
if (timestamp) {
|
||||
int wrc;
|
||||
ssize_t wrc;
|
||||
|
||||
wrc = write_timestamp(this->pp_fd, woff);
|
||||
if (wrc == -1) {
|
||||
|
@ -34,6 +34,7 @@
|
||||
|
||||
#include <string>
|
||||
#include <sys/types.h>
|
||||
#include "auto_fd.hh"
|
||||
|
||||
/**
|
||||
* Creates a subprocess that reads data from a pipe and writes it to a file so
|
||||
@ -76,7 +77,7 @@ public:
|
||||
|
||||
private:
|
||||
/** A file descriptor that refers to the temporary file. */
|
||||
int pp_fd;
|
||||
auto_fd pp_fd;
|
||||
|
||||
/** The child process' pid. */
|
||||
pid_t pp_child;
|
||||
|
@ -339,7 +339,7 @@ readline_curses::readline_curses()
|
||||
stifle_history(HISTORY_SIZE);
|
||||
|
||||
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 */
|
||||
}
|
||||
|
||||
|
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_mem \
|
||||
test_bookmarks \
|
||||
test_chunky_index \
|
||||
test_concise \
|
||||
test_date_time_scanner \
|
||||
test_grep_proc2 \
|
||||
@ -62,6 +63,9 @@ test_auto_mem_SOURCES = test_auto_mem.cc
|
||||
test_bookmarks_SOURCES = test_bookmarks.cc
|
||||
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_LDADD = ../src/libdiag.a $(SQLITE3_LIBS)
|
||||
|
||||
@ -235,6 +239,7 @@ TESTS = \
|
||||
test_auto_fd \
|
||||
test_auto_mem \
|
||||
test_bookmarks \
|
||||
test_chunky_index \
|
||||
test_date_time_scanner \
|
||||
test_cmds.sh \
|
||||
test_concise \
|
||||
|
@ -88,16 +88,16 @@ check_PROGRAMS = drive_data_scanner$(EXEEXT) \
|
||||
drive_vt52_curses$(EXEEXT) drive_readline_curses$(EXEEXT) \
|
||||
slicer$(EXEEXT) scripty$(EXEEXT) test_ansi_scrubber$(EXEEXT) \
|
||||
test_auto_fd$(EXEEXT) test_auto_mem$(EXEEXT) \
|
||||
test_bookmarks$(EXEEXT) test_concise$(EXEEXT) \
|
||||
test_date_time_scanner$(EXEEXT) test_grep_proc2$(EXEEXT) \
|
||||
test_hist_source$(EXEEXT) test_json_ptr$(EXEEXT) \
|
||||
test_line_buffer2$(EXEEXT) test_log_accel$(EXEEXT) \
|
||||
test_pcrepp$(EXEEXT) test_top_status$(EXEEXT) \
|
||||
test_yajlpp$(EXEEXT)
|
||||
test_bookmarks$(EXEEXT) test_chunky_index$(EXEEXT) \
|
||||
test_concise$(EXEEXT) test_date_time_scanner$(EXEEXT) \
|
||||
test_grep_proc2$(EXEEXT) test_hist_source$(EXEEXT) \
|
||||
test_json_ptr$(EXEEXT) test_line_buffer2$(EXEEXT) \
|
||||
test_log_accel$(EXEEXT) test_pcrepp$(EXEEXT) \
|
||||
test_top_status$(EXEEXT) test_yajlpp$(EXEEXT)
|
||||
TESTS = test_ansi_scrubber$(EXEEXT) test_auto_fd$(EXEEXT) \
|
||||
test_auto_mem$(EXEEXT) test_bookmarks$(EXEEXT) \
|
||||
test_date_time_scanner$(EXEEXT) test_cmds.sh \
|
||||
test_concise$(EXEEXT) test_line_buffer2$(EXEEXT) \
|
||||
test_chunky_index$(EXEEXT) test_date_time_scanner$(EXEEXT) \
|
||||
test_cmds.sh test_concise$(EXEEXT) test_line_buffer2$(EXEEXT) \
|
||||
test_line_buffer.sh test_listview.sh test_mvwattrline.sh \
|
||||
test_grep_proc.sh test_grep_proc2$(EXEEXT) \
|
||||
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)
|
||||
test_bookmarks_OBJECTS = $(am_test_bookmarks_OBJECTS)
|
||||
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)
|
||||
test_concise_OBJECTS = $(am_test_concise_OBJECTS)
|
||||
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) \
|
||||
$(slicer_SOURCES) $(test_ansi_scrubber_SOURCES) \
|
||||
$(test_auto_fd_SOURCES) $(test_auto_mem_SOURCES) \
|
||||
$(test_bookmarks_SOURCES) $(test_concise_SOURCES) \
|
||||
$(test_date_time_scanner_SOURCES) $(test_grep_proc2_SOURCES) \
|
||||
$(test_hist_source_SOURCES) $(test_json_ptr_SOURCES) \
|
||||
$(test_line_buffer2_SOURCES) $(test_log_accel_SOURCES) \
|
||||
$(test_pcrepp_SOURCES) $(test_top_status_SOURCES) \
|
||||
$(test_yajlpp_SOURCES)
|
||||
$(test_bookmarks_SOURCES) $(test_chunky_index_SOURCES) \
|
||||
$(test_concise_SOURCES) $(test_date_time_scanner_SOURCES) \
|
||||
$(test_grep_proc2_SOURCES) $(test_hist_source_SOURCES) \
|
||||
$(test_json_ptr_SOURCES) $(test_line_buffer2_SOURCES) \
|
||||
$(test_log_accel_SOURCES) $(test_pcrepp_SOURCES) \
|
||||
$(test_top_status_SOURCES) $(test_yajlpp_SOURCES)
|
||||
DIST_SOURCES = $(drive_data_scanner_SOURCES) \
|
||||
$(drive_grep_proc_SOURCES) $(drive_json_op_SOURCES) \
|
||||
$(drive_json_ptr_walk_SOURCES) $(drive_line_buffer_SOURCES) \
|
||||
@ -284,11 +287,12 @@ DIST_SOURCES = $(drive_data_scanner_SOURCES) \
|
||||
$(scripty_SOURCES) $(slicer_SOURCES) \
|
||||
$(test_ansi_scrubber_SOURCES) $(test_auto_fd_SOURCES) \
|
||||
$(test_auto_mem_SOURCES) $(test_bookmarks_SOURCES) \
|
||||
$(test_concise_SOURCES) $(test_date_time_scanner_SOURCES) \
|
||||
$(test_grep_proc2_SOURCES) $(test_hist_source_SOURCES) \
|
||||
$(test_json_ptr_SOURCES) $(test_line_buffer2_SOURCES) \
|
||||
$(test_log_accel_SOURCES) $(test_pcrepp_SOURCES) \
|
||||
$(test_top_status_SOURCES) $(test_yajlpp_SOURCES)
|
||||
$(test_chunky_index_SOURCES) $(test_concise_SOURCES) \
|
||||
$(test_date_time_scanner_SOURCES) $(test_grep_proc2_SOURCES) \
|
||||
$(test_hist_source_SOURCES) $(test_json_ptr_SOURCES) \
|
||||
$(test_line_buffer2_SOURCES) $(test_log_accel_SOURCES) \
|
||||
$(test_pcrepp_SOURCES) $(test_top_status_SOURCES) \
|
||||
$(test_yajlpp_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@ -662,6 +666,8 @@ test_auto_fd_LDADD = ../src/libdiag.a
|
||||
test_auto_mem_SOURCES = test_auto_mem.cc
|
||||
test_bookmarks_SOURCES = test_bookmarks.cc
|
||||
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_LDADD = ../src/libdiag.a $(SQLITE3_LIBS)
|
||||
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)
|
||||
$(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)
|
||||
@rm -f test_concise$(EXEEXT)
|
||||
$(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_mem.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_date_time_scanner.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 \
|
||||
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||
"$$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)
|
||||
@p='test_date_time_scanner$(EXEEXT)'; \
|
||||
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