Added a new source_context function
This commit is contained in:
parent
513e2b59eb
commit
fbb734689b
3 changed files with 43 additions and 23 deletions
36
src/error.cc
36
src/error.cc
|
|
@ -77,4 +77,40 @@ string line_context(const string& line,
|
||||||
return buf.str();
|
return buf.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string source_context(const path& file,
|
||||||
|
std::size_t pos,
|
||||||
|
std::size_t end_pos,
|
||||||
|
const string& prefix)
|
||||||
|
{
|
||||||
|
std::size_t len = end_pos - pos;
|
||||||
|
if (! len)
|
||||||
|
return _("<no source context>");
|
||||||
|
|
||||||
|
assert(len > 0);
|
||||||
|
assert(len < 2048);
|
||||||
|
|
||||||
|
std::ostringstream out;
|
||||||
|
|
||||||
|
ifstream in(file);
|
||||||
|
in.seekg(pos, std::ios::beg);
|
||||||
|
|
||||||
|
scoped_array<char> buf(new char[len + 1]);
|
||||||
|
in.read(buf.get(), len);
|
||||||
|
assert(static_cast<std::size_t>(in.gcount()) == len);
|
||||||
|
buf[len] = '\0';
|
||||||
|
|
||||||
|
bool first = true;
|
||||||
|
for (char * p = std::strtok(buf.get(), "\n");
|
||||||
|
p;
|
||||||
|
p = std::strtok(NULL, "\n")) {
|
||||||
|
if (first)
|
||||||
|
first = false;
|
||||||
|
else
|
||||||
|
out << '\n';
|
||||||
|
out << prefix << p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ledger
|
} // namespace ledger
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,11 @@ string line_context(const string& line,
|
||||||
std::size_t pos = 0,
|
std::size_t pos = 0,
|
||||||
std::size_t end_pos = 0);
|
std::size_t end_pos = 0);
|
||||||
|
|
||||||
|
string source_context(const path& file,
|
||||||
|
std::size_t pos,
|
||||||
|
std::size_t end_pos,
|
||||||
|
const string& prefix = "");
|
||||||
|
|
||||||
#define DECLARE_EXCEPTION(name, kind) \
|
#define DECLARE_EXCEPTION(name, kind) \
|
||||||
class name : public kind { \
|
class name : public kind { \
|
||||||
public: \
|
public: \
|
||||||
|
|
|
||||||
25
src/item.cc
25
src/item.cc
|
|
@ -367,30 +367,9 @@ bool item_t::valid() const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_item(std::ostream& out,
|
void print_item(std::ostream& out, const item_t& item, const string& prefix)
|
||||||
const item_t& item,
|
|
||||||
const string& prefix)
|
|
||||||
{
|
{
|
||||||
std::size_t len = item.end_pos - item.beg_pos;
|
out << source_context(item.pathname, item.beg_pos, item.end_pos, prefix);
|
||||||
|
|
||||||
ifstream in(item.pathname);
|
|
||||||
in.seekg(item.beg_pos, std::ios::beg);
|
|
||||||
|
|
||||||
scoped_array<char> buf(new char[len + 1]);
|
|
||||||
in.read(buf.get(), len);
|
|
||||||
assert(static_cast<std::size_t>(in.gcount()) == len);
|
|
||||||
buf[len] = '\0';
|
|
||||||
|
|
||||||
bool first = true;
|
|
||||||
for (char * p = std::strtok(buf.get(), "\n");
|
|
||||||
p;
|
|
||||||
p = std::strtok(NULL, "\n")) {
|
|
||||||
if (first)
|
|
||||||
first = false;
|
|
||||||
else
|
|
||||||
out << '\n';
|
|
||||||
out << prefix << p;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string item_context(const item_t& item, const string& desc)
|
string item_context(const item_t& item, const string& desc)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue