public:
move_cmd(cmd *c)
{
- x = c->args.at(0)->as_double(0);
- y = c->args.at(1)->as_double(0);
+ x = c->arg("x")->as_double(0);
+ y = c->arg("y")->as_double(0);
}
page *process_page(page *p) override
{
public:
scale_cmd(cmd *c)
{
- x_factor = c->args.at(0)->as_double(1);
- y_factor = c->args.at(1)->as_double(x_factor);
+ x_factor = c->arg("x")->as_double(1);
+ y_factor = c->arg("y")->as_double(x_factor);
}
page *process_page(page *p) override
{
public:
rotate_cmd(cmd *c)
{
- deg = c->args.at(0)->as_int(0) % 360;
+ deg = c->arg("deg")->as_int(0) % 360;
if (deg < 0)
deg += 360;
if (deg % 90)
public:
flip_cmd(cmd *c)
{
- horizontal = c->args.at(0)->as_int(0);
- vertical = c->args.at(1)->as_int(0);
+ horizontal = c->arg("h")->as_int(0);
+ vertical = c->arg("v")->as_int(0);
if (!horizontal && !vertical)
die("Flip has no direction specified");
}
public:
modulo_cmd(cmd *c)
{
- n = c->args.at(0)->as_int(0);
+ n = c->arg("n")->as_int(0);
if (n <= 0)
die("Modulo must have n > 0");
pipe = c->pipe;
#include <vector>
#include <list>
+#include <unordered_map>
using namespace std;
virtual string dump() { return "<undef>"; }
};
+extern arg_val null_arg;
+
struct out_context {
QPDFObjectHandle resources;
QPDFObjectHandle xobjects;
struct cmd {
const cmd_def *def;
- vector<arg_val *> args;
+ unordered_map<string, arg_val *> args;
pipeline *pipe;
cmd_exec *exec;
+ arg_val *arg(const string name)
+ {
+ auto it = args.find(name);
+ if (it != args.end())
+ return it->second;
+ else
+ return &null_arg;
+ }
};
struct pipeline_selector {
string dump() { return "<string> \"" + val + '"'; }
};
-static arg_val null_arg;
+arg_val null_arg;
/*** Parser ***/
while (adefs[num_args].name)
num_args++;
- c->args.resize(num_args, &null_arg);
-
token_type t = next_token();
if (t != TOK_OPEN_PAREN)
{
argi++;
if (!adefs[argi].name)
parse_error("Command %s has no parameter %s", cdef->name, token.c_str());
- if (c->args.at(argi)->given())
+ if (c->args.count(token))
parse_error("Parameter %s given multiple times", token.c_str());
t = next_token();
if (t == TOK_EQUAL)
parse_error("Parameter %s must have a value", adef->name);
}
- c->args.at(argi) = val;
+ c->args[adef->name] = val;
t = next_token();
if (t == TOK_CLOSE_PAREN)
}
for (uint i=0; i<num_args; i++)
- if ((adefs[i].type & AT_MANDATORY) && !c->args.at(i)->given())
+ if ((adefs[i].type & AT_MANDATORY) && !c->args.count(adefs[i].name))
parse_error("Command %s is missing a parameter %s", cdef->name, adefs[i].name);
}
static void debug_cmd(cmd *c, uint indent=0)
{
printf("%*sCommand %s\n", indent, "", c->def->name);
- for (size_t i=0; i < c->args.size(); i++)
+ for (uint i=0; c->def->arg_defs[i].name; i++)
{
const arg_def *adef = &c->def->arg_defs[i];
- string dump = c->args.at(i)->dump();
+ string dump = c->arg(adef->name)->dump();
printf("%*sArg #%d: %s = %s\n", indent+4, "", (int) i, adef->name, dump.c_str());
}
if (c->pipe)