aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-01-13 04:07:44 +0000
committerDavid Robillard <d@drobilla.net>2011-01-13 04:07:44 +0000
commit206c01b4ba4c5e674e313d7ed7fe21c2b93f2d12 (patch)
treef9564c63a471067af3aa8f1d7fe83c26a0f0a244 /src
parentceebe5e8bd7593b99d2a4c8b8fa733a85e0eae81 (diff)
downloadresp-206c01b4ba4c5e674e313d7ed7fe21c2b93f2d12.tar.gz
resp-206c01b4ba4c5e674e313d7ed7fe21c2b93f2d12.tar.bz2
resp-206c01b4ba4c5e674e313d7ed7fe21c2b93f2d12.zip
Fix error location reporting.
git-svn-id: http://svn.drobilla.net/resp/trunk@406 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'src')
-rw-r--r--src/parse.cpp24
-rw-r--r--src/repl.cpp2
-rw-r--r--src/resp.cpp4
3 files changed, 16 insertions, 14 deletions
diff --git a/src/parse.cpp b/src/parse.cpp
index 4f2c723..b61b971 100644
--- a/src/parse.cpp
+++ b/src/parse.cpp
@@ -55,9 +55,9 @@ eat_char(Cursor& cur, istream& in, const char character)
static const AST*
read_string(Cursor& cur, istream& in)
{
- Cursor loc = cur;
- string str;
- char c;
+ const Cursor loc = cur;
+ string str;
+ char c;
eat_char(cur, in, '"');
while ((c = read_char(cur, in)) != '"') {
switch (c) {
@@ -89,13 +89,14 @@ read_line_comment(Cursor& cur, istream& in)
static const AST*
read_list(PEnv& penv, Cursor& cur, istream& in)
{
- List list;
-
+ const Cursor loc = cur;
+ List list;
eat_char(cur, in, '(');
while (true) {
skip_space(cur, in);
if (in.peek() == ')') {
eat_char(cur, in, ')');
+ list.head->loc = loc;
return list.head;
} else {
list.push_back(penv.parse(cur, in));
@@ -127,9 +128,9 @@ read_special(Cursor& cur, istream& in)
static const AST*
read_number(Cursor& cur, istream& in)
{
- Cursor loc = cur;
- string str;
- char c;
+ const Cursor loc = cur;
+ string str;
+ char c;
while ((c = in.peek()) != EOF) {
if (isdigit(c) || c == '.')
str += read_char(cur, in);
@@ -146,8 +147,9 @@ read_number(Cursor& cur, istream& in)
static const AST*
read_symbol(PEnv& penv, Cursor& cur, istream& in)
{
- string str;
- char c;
+ const Cursor loc = cur;
+ string str;
+ char c;
while ((c = in.peek()) != EOF) {
if (!isspace(c) && c != ')' && c != '(' && c != EOF && c != -1)
str += read_char(cur, in);
@@ -155,7 +157,7 @@ read_symbol(PEnv& penv, Cursor& cur, istream& in)
break;
}
- return penv.sym(str, cur);
+ return penv.sym(str, loc);
}
/// Read an expression from @a in
diff --git a/src/repl.cpp b/src/repl.cpp
index c461526..8fe43f5 100644
--- a/src/repl.cpp
+++ b/src/repl.cpp
@@ -175,7 +175,7 @@ repl(CEnv& cenv)
while (1) {
cenv.out << "() ";
cenv.out.flush();
- Cursor cursor("(stdin)");
+ Cursor cursor("(stdin)", 1, 1);
try {
if (!readParseType(cenv, cursor, std::cin, exp, ast))
diff --git a/src/resp.cpp b/src/resp.cpp
index 2b08fc3..e2f5a49 100644
--- a/src/resp.cpp
+++ b/src/resp.cpp
@@ -155,7 +155,7 @@ main(int argc, char** argv)
ifstream is(*f);
try {
while (is.good() && !is.eof()) {
- Cursor loc(*f);
+ Cursor loc(*f, 1, 1);
const AST* exp = cenv->penv.parse(loc, is);
if (!exp || (exp->to_tuple() && exp->to_tuple()->empty()))
break;
@@ -194,7 +194,7 @@ main(int argc, char** argv)
ifstream is(*f);
if (is.good()) {
- Cursor cursor(filename);
+ Cursor cursor(filename, 1, 1);
ret = ret | eval(*cenv, cursor, is, !batch);
} else {
cerr << argv[0] << ": " << *f << ": " << strerror(errno) << endl;