From 47ff0b9fed27367aad5a4fb7dea28032d3915657 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Thu, 26 Feb 2009 05:46:59 -0400 Subject: Fixes to the way textual directives were parsed --- src/textual.cc | 44 ++++++++++++++++++++++++-------------------- 1 file 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 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 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)); -- cgit v1.2.3