aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
authorBen Burdette <bburdette@gmail.com>2020-05-20 22:18:26 -0600
committerBen Burdette <bburdette@gmail.com>2020-05-20 22:18:26 -0600
commit6a420d672ca690ef4235ac7a5833c1789a7d8b10 (patch)
treee9adbc63c159896bbbdc332800986b37c7d04e9b /src/libutil
parent85ce455b854761b1fd4985ed21ef5a8881eb3c11 (diff)
print LOC for stdin, string args
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/error.cc88
-rw-r--r--src/libutil/error.hh9
2 files changed, 72 insertions, 25 deletions
diff --git a/src/libutil/error.cc b/src/libutil/error.cc
index 7aff9381b..ee415e18c 100644
--- a/src/libutil/error.cc
+++ b/src/libutil/error.cc
@@ -59,22 +59,51 @@ void getCodeLines(NixCode &nixCode)
return;
// check this magic value!
- if (nixCode.errPos.file == "(string)")
- return;
-
- try {
- AutoCloseFD fd = open(nixCode.errPos.file.c_str(), O_RDONLY | O_CLOEXEC);
- if (!fd)
- throw SysError("opening file '%1%'", nixCode.errPos.file);
-
+ if (nixCode.errPos.origin == foFile) {
+ try {
+ AutoCloseFD fd = open(nixCode.errPos.file.c_str(), O_RDONLY | O_CLOEXEC);
+ if (!fd)
+ throw SysError("opening file '%1%'", nixCode.errPos.file);
+
+ // count the newlines.
+ int count = 0;
+ string line;
+ int pl = nixCode.errPos.line - 1;
+ do
+ {
+ line = readLine(fd.get());
+ ++count;
+ if (count < pl)
+ {
+ ;
+ }
+ else if (count == pl) {
+ nixCode.prevLineOfCode = line;
+ } else if (count == pl + 1) {
+ nixCode.errLineOfCode = line;
+ } else if (count == pl + 2) {
+ nixCode.nextLineOfCode = line;
+ break;
+ }
+ } while (true);
+ }
+ catch (EndOfFile &eof) {
+ ;
+ }
+ catch (std::exception &e) {
+ printError("error reading nix file: %s\n%s", nixCode.errPos.file, e.what());
+ }
+ } else {
+ std::istringstream iss(nixCode.errPos.file);
// count the newlines.
-
int count = 0;
string line;
int pl = nixCode.errPos.line - 1;
+
do
{
- line = readLine(fd.get());
+ std::getline(iss, line);
+ // std::cout << "getline result: " << std::getline(iss, line) << std::endl;
++count;
if (count < pl)
{
@@ -88,14 +117,11 @@ void getCodeLines(NixCode &nixCode)
nixCode.nextLineOfCode = line;
break;
}
+
+ if (!iss.good())
+ break;
} while (true);
}
- catch (EndOfFile &eof) {
- ;
- }
- catch (std::exception &e) {
- printError("error reading nix file: %s\n%s", nixCode.errPos.file, e.what());
- }
}
@@ -225,15 +251,27 @@ std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo)
// filename, line, column.
if (einfo.nixCode.has_value()) {
- if (einfo.nixCode->errPos.file != "") {
- out << fmt("%1%in file: " ANSI_BLUE "%2% %3%" ANSI_NORMAL,
- prefix,
- einfo.nixCode->errPos.file,
- showErrPos(einfo.nixCode->errPos)) << std::endl;
- out << prefix << std::endl;
- } else {
- out << fmt("%1%from command line argument", prefix) << std::endl;
- out << prefix << std::endl;
+ switch (einfo.nixCode->errPos.origin) {
+ case foFile: {
+ out << fmt("%1%in file: " ANSI_BLUE "%2% %3%" ANSI_NORMAL,
+ prefix,
+ einfo.nixCode->errPos.file,
+ showErrPos(einfo.nixCode->errPos)) << std::endl;
+ out << prefix << std::endl;
+ break;
+ }
+ case foString: {
+ out << fmt("%1%from command line argument", prefix) << std::endl;
+ out << prefix << std::endl;
+ break;
+ }
+ case foStdin: {
+ out << fmt("%1%from stdin", prefix) << std::endl;
+ out << prefix << std::endl;
+ break;
+ }
+ default:
+ throw Error("invalid FileOrigin in errPos");
}
}
diff --git a/src/libutil/error.hh b/src/libutil/error.hh
index b374c2780..d60c0fefe 100644
--- a/src/libutil/error.hh
+++ b/src/libutil/error.hh
@@ -32,10 +32,18 @@ typedef enum {
lvlVomit
} Verbosity;
+typedef enum {
+ foFile,
+ foStdin,
+ foString
+} FileOrigin;
+
+
struct ErrPos {
int line = 0;
int column = 0;
string file;
+ FileOrigin origin;
operator bool() const
{
@@ -45,6 +53,7 @@ struct ErrPos {
template <class P>
ErrPos& operator=(const P &pos)
{
+ origin = pos.origin;
line = pos.line;
column = pos.column;
file = pos.file;