Fixes to the way textual directives were parsed

This commit is contained in:
John Wiegley 2009-02-26 05:46:59 -04:00
parent b302c340b6
commit 47ff0b9fed

View file

@ -635,7 +635,7 @@ void instance_t::xact_directive(char * line, std::streamsize len)
void instance_t::include_directive(char * line) void instance_t::include_directive(char * line)
{ {
path filename(next_element(line)); path filename(line);
#if 0 #if 0
if (filename[0] != '/' && filename[0] != '\\' && filename[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) void instance_t::account_directive(char * line)
{ {
if (account_t * acct = if (account_t * acct = account_stack.front()->find_account(line))
account_stack.front()->find_account(next_element(line)))
account_stack.push_front(acct); account_stack.push_front(acct);
else else
assert(! "Failed to create account"); assert(! "Failed to create account");
@ -676,12 +675,18 @@ void instance_t::account_directive(char * line)
void instance_t::end_directive(char *) 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) void instance_t::alias_directive(char * line)
{ {
char * b = skip_ws(line + 1); char * b = skip_ws(line);
if (char * e = std::strchr(b, '=')) { if (char * e = std::strchr(b, '=')) {
char * z = e - 1; char * z = e - 1;
while (std::isspace(*z)) while (std::isspace(*z))
@ -702,58 +707,57 @@ void instance_t::alias_directive(char * line)
void instance_t::define_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 def.compile(session_scope); // causes definitions to be established
} }
void instance_t::general_directive(char * line) void instance_t::general_directive(char * line)
{ {
char * p = next_element(line); char * p = line;
if (! p) char * arg = next_element(line);
return;
string word(line + 1); if (*p == '@' || *p == '!')
p++;
switch (*p) { switch (*p) {
case 'a': case 'a':
if (std::strcmp(p, "account") == 0) { if (std::strcmp(p, "account") == 0) {
account_directive(line); account_directive(arg);
return; return;
} }
else if (std::strcmp(p, "alias") == 0) { else if (std::strcmp(p, "alias") == 0) {
alias_directive(line); alias_directive(arg);
return; return;
} }
break; break;
case 'd': case 'd':
if (std::strcmp(p, "def") == 0) { if (std::strcmp(p, "def") == 0) {
define_directive(line); define_directive(arg);
return; return;
} }
break; break;
case 'e': case 'e':
if (std::strcmp(p, "end") == 0) { if (std::strcmp(p, "end") == 0) {
end_directive(line); end_directive(arg);
return; return;
} }
break; break;
case 'i': case 'i':
if (std::strcmp(p, "include") == 0) { if (std::strcmp(p, "include") == 0) {
include_directive(line); include_directive(arg);
return; return;
} }
break; 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. // 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())) { if (expr_t::ptr_op_t op = lookup(directive.get())) {
call_scope_t args(*this); call_scope_t args(*this);
args.push_back(string_value(p)); args.push_back(string_value(p));