diff options
Diffstat (limited to 'src/FbTk/LogicCommands.cc')
-rw-r--r-- | src/FbTk/LogicCommands.cc | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/FbTk/LogicCommands.cc b/src/FbTk/LogicCommands.cc index 99b5b53..1c6f238 100644 --- a/src/FbTk/LogicCommands.cc +++ b/src/FbTk/LogicCommands.cc | |||
@@ -23,8 +23,101 @@ | |||
23 | 23 | ||
24 | #include "LogicCommands.hh" | 24 | #include "LogicCommands.hh" |
25 | 25 | ||
26 | #include "CommandRegistry.hh" | ||
27 | #include "StringUtil.hh" | ||
28 | |||
29 | using FbTk::StringUtil::removeFirstWhitespace; | ||
30 | using FbTk::StringUtil::toLower; | ||
31 | using std::string; | ||
32 | |||
26 | namespace FbTk { | 33 | namespace FbTk { |
27 | 34 | ||
35 | namespace { | ||
36 | |||
37 | template <typename M> | ||
38 | M *addCommands(M *macro, const string &args, bool trusted) { | ||
39 | int pos = 0, err = 0; | ||
40 | string cmd; | ||
41 | |||
42 | while (true) { | ||
43 | RefCount<BoolCommand> tmp(0); | ||
44 | err = StringUtil::getStringBetween(cmd, args.c_str() + pos, | ||
45 | '{', '}', " \t\n", true); | ||
46 | pos += err; | ||
47 | if (err == 0) | ||
48 | break; | ||
49 | |||
50 | tmp = CommandRegistry::instance().parseBoolLine(cmd, trusted); | ||
51 | if (*tmp) | ||
52 | macro->add(tmp); | ||
53 | } | ||
54 | |||
55 | if (macro->size() > 0) | ||
56 | return macro; | ||
57 | delete macro; | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | BoolCommand *parseLogicCommand(const string &command, const string &args, | ||
62 | bool trusted) { | ||
63 | if (command == "not") { | ||
64 | BoolCommand *boolcmd = | ||
65 | CommandRegistry::instance().parseBoolLine(args, trusted); | ||
66 | if (!boolcmd) | ||
67 | return 0; | ||
68 | RefCount<BoolCommand> ref(boolcmd); | ||
69 | return new NotCommand(ref); | ||
70 | } else if (command == "and") | ||
71 | return addCommands<AndCommand>(new AndCommand(), args, trusted); | ||
72 | else if (command == "or") | ||
73 | return addCommands<OrCommand>(new OrCommand(), args, trusted); | ||
74 | else if (command == "xor") | ||
75 | return addCommands<XorCommand>(new XorCommand(), args, trusted); | ||
76 | return 0; | ||
77 | } | ||
78 | |||
79 | REGISTER_BOOLCOMMAND_PARSER(not, parseLogicCommand); | ||
80 | REGISTER_BOOLCOMMAND_PARSER(and, parseLogicCommand); | ||
81 | REGISTER_BOOLCOMMAND_PARSER(or, parseLogicCommand); | ||
82 | REGISTER_BOOLCOMMAND_PARSER(xor, parseLogicCommand); | ||
83 | |||
84 | }; // end anonymous namespace | ||
85 | |||
86 | Command *IfCommand::parse(const std::string &command, const std::string &args, | ||
87 | bool trusted) { | ||
88 | std::string cmd; | ||
89 | int err = 0, pos = 0; | ||
90 | RefCount<BoolCommand> cond(0); | ||
91 | RefCount<Command> t(0), f(0); | ||
92 | |||
93 | err = StringUtil::getStringBetween(cmd, args.c_str(), | ||
94 | '{', '}', " \t\n", true); | ||
95 | if (err > 0) | ||
96 | cond = CommandRegistry::instance().parseBoolLine(cmd, trusted); | ||
97 | if (err == 0 || *cond == 0) | ||
98 | return 0; | ||
99 | |||
100 | pos = err; | ||
101 | err = StringUtil::getStringBetween(cmd, args.c_str() + pos, | ||
102 | '{', '}', " \t\n", true); | ||
103 | if (err == 0) | ||
104 | return 0; | ||
105 | t = CommandRegistry::instance().parseLine(cmd, trusted); | ||
106 | |||
107 | pos += err; | ||
108 | err = StringUtil::getStringBetween(cmd, args.c_str() + pos, | ||
109 | '{', '}', " \t\n", true); | ||
110 | if (err > 0) | ||
111 | f = CommandRegistry::instance().parseLine(cmd, trusted); | ||
112 | if (err == 0 || *t == 0 && *f == 0) | ||
113 | return 0; | ||
114 | |||
115 | return new IfCommand(cond, t, f); | ||
116 | } | ||
117 | |||
118 | REGISTER_COMMAND_PARSER(if, IfCommand::parse); | ||
119 | REGISTER_COMMAND_PARSER(cond, IfCommand::parse); | ||
120 | |||
28 | void OrCommand::add(RefCount<BoolCommand> &com) { | 121 | void OrCommand::add(RefCount<BoolCommand> &com) { |
29 | m_commandlist.push_back(com); | 122 | m_commandlist.push_back(com); |
30 | } | 123 | } |