• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

MikkelSchubert / adapterremoval / #87

13 Apr 2025 07:59AM UTC coverage: 27.35% (+0.02%) from 27.335%
#87

push

travis-ci

web-flow
abort on sanitation warnings (#114)

* re-add `-fno-sanitize-recover=all`; this was lost during the transition to Meson
* remove tests that rely on undefined behavior
* fix and clean up duplicate tests

2723 of 9956 relevant lines covered (27.35%)

4049.68 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.43
/src/linereader.hpp
1
// SPDX-License-Identifier: GPL-3.0-or-later
2
// SPDX-FileCopyrightText: 2015 Mikkel Schubert <mikkelsch@gmail.com>
3
#pragma once
4

5
#include "managed_io.hpp" // for managed_reader
6
#include <array>          // for array
7
#include <cstdio>         // for BUFSIZ
8
#include <ios>            // for ios_base, ios_base::failure
9
#include <isa-l.h>        // for ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION
10
#include <memory>         // for shared_ptr, unique_ptr
11
#include <string>         // for string
12
#include <vector>         // for vector
13

14
struct inflate_state;
15
struct isal_gzip_header;
16

17
// Required due to 2.30 fixing issues when reading concatenated gzip files
18
static_assert((ISAL_MAJOR_VERSION > 2 ||
19
               (ISAL_MAJOR_VERSION == 2 && ISAL_MINOR_VERSION >= 30)),
20
              "isa-l v2.30+ required");
21

22
namespace adapterremoval {
23

24
//! Buffer used for compressed and uncompressed line data
25
using line_buffer = std::array<char, 10LLU * BUFSIZ>;
26

27
/** Base-class for line reading; used by receivers. */
28
class line_reader_base
29
{
30
public:
31
  /** Does nothing. */
32
  line_reader_base() = default;
34✔
33

34
  /** Closes the file, if still open. */
35
  virtual ~line_reader_base() = default;
34✔
36

×
37
  /** Reads a line into dst, returning false on EOF. */
34✔
38
  virtual bool getline(std::string& dst) = 0;
39

40
  line_reader_base(const line_reader_base&) = delete;
41
  line_reader_base(line_reader_base&&) = delete;
42
  line_reader_base& operator=(const line_reader_base&) = delete;
43
  line_reader_base& operator=(line_reader_base&&) = delete;
44
};
45

46
/** Simple helper class for reading strings from memory */
47
class vec_reader : public line_reader_base
48
{
49
public:
50
  /** Constructs a reader from a set of lines (not copied) */
51
  explicit vec_reader(const std::vector<std::string>& lines);
52

53
  /** Reads a line into dst, returning false on EOF. */
54
  bool getline(std::string& dst) override;
55

56
private:
57
  //! Reference to vector containing lines of text
58
  const std::vector<std::string>& m_lines;
59
  //! Current position in m_lines
60
  std::vector<std::string>::const_iterator m_it;
61
};
62

63
/**
64
 * Simple line reader.
65
 *
66
 * Currently reads
67
 *  - uncompressed files
68
 *  - gzip compressed files
69
 *
70
 * Errors are reported using either 'io_error' or 'gzip_error'.
71
 */
72
class line_reader : public line_reader_base
73
{
74
public:
75
  /** Creates a line handler from an existing handle */
76
  explicit line_reader(FILE* handle);
77
  /** Constructor; opens file and throws on errors. */
78
  explicit line_reader(std::string filename);
79

80
  ~line_reader() override = default;
81

82
  /** Reads a line into dst, returning false on EOF. */
39✔
83
  bool getline(std::string& dst) override;
×
84

39✔
85
  line_reader(const line_reader&) = delete;
86
  line_reader(line_reader&&) = delete;
87
  line_reader& operator=(const line_reader&) = delete;
88
  line_reader& operator=(line_reader&&) = delete;
89

90
private:
91
  //! Refills 'm_buffer' and sets 'm_buffer_ptr' and 'm_buffer_end'.
92
  void refill_buffers();
93

94
  //! Reader used to fill unparsed buffers
95
  managed_reader m_reader;
96
  /** Refills 'm_raw_buffer'; sets 'm_raw_buffer_ptr' and 'm_raw_buffer_end'. */
97
  void refill_raw_buffer(size_t avail_in = 0);
98
  /** Points 'm_buffer' and other points to corresponding 'm_raw_buffer's. */
99
  void refill_buffers_uncompressed();
100

101
  std::unique_ptr<inflate_state> m_gzip_stream;
102
  std::unique_ptr<isal_gzip_header> m_gzip_header;
103

104
  /** Returns true if the raw buffer contains gzip'd data. */
105
  bool is_raw_buffer_gzip() const;
106
  /** Initializes gzip stream and output buffers. */
107
  void initialize_buffers_gzip();
108
  /** Refills 'm_buffer' from compressed data; may refill raw buffers. */
109
  void refill_buffers_gzip();
110

111
  //! Pointer to buffer of decompressed data; may be equal to m_raw_buffer.
112
  std::shared_ptr<line_buffer> m_buffer;
113
  //! Pointer to current location in input buffer.
114
  line_buffer::iterator m_buffer_ptr;
115
  //! Pointer to end of current buffer.
116
  line_buffer::iterator m_buffer_end;
117

118
  //! Pointer to buffer of raw data.
119
  std::shared_ptr<line_buffer> m_raw_buffer;
120
  //! Pointer to end of current raw buffer.
121
  line_buffer::iterator m_raw_buffer_end;
122

123
  //! Indicates if a read across the EOF has been attempted.
124
  bool m_eof;
125
};
126

127
} // namespace adapterremoval
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc