summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-02-26 05:46:59 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-02-26 05:46:59 -0400
commit47ff0b9fed27367aad5a4fb7dea28032d3915657 (patch)
treebe9457799319e875900f99ede0337930d340aada
parentb302c340b607d1607174faefbe53416b6e9aafbc (diff)
downloadfork-ledger-47ff0b9fed27367aad5a4fb7dea28032d3915657.tar.gz
fork-ledger-47ff0b9fed27367aad5a4fb7dea28032d3915657.tar.bz2
fork-ledger-47ff0b9fed27367aad5a4fb7dea28032d3915657.zip
Fixes to the way textual directives were parsed
-rw-r--r--src/textual.cc44
1 files changed, 24 insertions, 20 deletions
diff --git a/src/textual.cc b/src/textual.cc
index 3a03937f..b55004ab 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -635,7 +635,7 @@ void instance_t::xact_directive(char * line, std::streamsize len)
void instance_t::include_directive(char * line)
{
- path filename(next_element(line));
+ path filename(line);
#if 0
if (filename[0] != '/' && filename[0] != '\\' && filename[0] != '~') {
@@ -667,8 +667,7 @@ void instance_t::include_directive(char * line)
void instance_t::account_directive(char * line)
{
- if (account_t * acct =
- account_stack.front()->find_account(next_element(line)))
+ if (account_t * acct = account_stack.front()->find_account(line))
account_stack.push_front(acct);
else
assert(! "Failed to create account");
@@ -676,12 +675,18 @@ void instance_t::account_directive(char * line)
void instance_t::end_directive(char *)
{
- account_stack.pop_front();
+ // jww (2009-02-26): Allow end to be "end account" or "end tag". End by
+ // itself is assumed to be "end account".
+ if (account_stack.empty())
+ throw_(std::runtime_error,
+ _("'end' directive found, but no account currently active"));
+ else
+ account_stack.pop_back();
}
void instance_t::alias_directive(char * line)
{
- char * b = skip_ws(line + 1);
+ char * b = skip_ws(line);
if (char * e = std::strchr(b, '=')) {
char * z = e - 1;
while (std::isspace(*z))
@@ -702,58 +707,57 @@ void instance_t::alias_directive(char * line)
void instance_t::define_directive(char * line)
{
- expr_t def(skip_ws(line + 1));
+ expr_t def(skip_ws(line));
def.compile(session_scope); // causes definitions to be established
}
void instance_t::general_directive(char * line)
{
- char * p = next_element(line);
- if (! p)
- return;
+ char * p = line;
+ char * arg = next_element(line);
- string word(line + 1);
+ if (*p == '@' || *p == '!')
+ p++;
switch (*p) {
case 'a':
if (std::strcmp(p, "account") == 0) {
- account_directive(line);
+ account_directive(arg);
return;
}
else if (std::strcmp(p, "alias") == 0) {
- alias_directive(line);
+ alias_directive(arg);
return;
}
break;
case 'd':
if (std::strcmp(p, "def") == 0) {
- define_directive(line);
+ define_directive(arg);
return;
}
break;
case 'e':
if (std::strcmp(p, "end") == 0) {
- end_directive(line);
+ end_directive(arg);
return;
}
break;
case 'i':
if (std::strcmp(p, "include") == 0) {
- include_directive(line);
+ include_directive(arg);
return;
}
break;
}
- static const std::size_t textdir_len = std::strlen("dir_");
- scoped_array<char> directive(new char[std::strlen(p) + textdir_len + 1]);
- std::strcpy(directive.get(), "dir_");
- std::strcpy(directive.get() + textdir_len, p);
-
// jww (2009-02-10): This needs some serious work.
+ scoped_array<char> directive(new char[std::strlen(p) + DIR_PREFIX_LEN + 1]);
+ std::strcpy(directive.get(),DIR_PREFIX);
+ std::strcpy(directive.get() + DIR_PREFIX_LEN, p);
+
if (expr_t::ptr_op_t op = lookup(directive.get())) {
call_scope_t args(*this);
args.push_back(string_value(p));