{
enum cmd_token_type type; // token type
u_char attr; // token attributes
+ bool allowrepeat; // matcher allowed to match token repetively?
+
char *text; // token text
char *desc; // token description
long long min, max; // for ranges
{
assert (n < vector_active (vline));
+ // get the minimum match level that can count as a full match
+ struct cmd_token *token = start->data;
+ enum match_type minmatch = min_match_level (token->type);
+
/* check history/stack of tokens
* this disallows matching the same one more than once if there is a
* circle in the graph (used for keyword arguments) */
if (n == MAXDEPTH)
return NULL;
- if (!start->allowrepeat)
+ if (!token->allowrepeat)
for (size_t s = 0; s < n; s++)
if (stack[s] == start)
return NULL;
- // get the minimum match level that can count as a full match
- struct cmd_token *token = start->data;
- enum match_type minmatch = min_match_level (token->type);
-
// get the current operating input token
char *input_token = vector_slot (vline, n);
{
child = vector_slot (node->to, i);
size_t j;
- if (!child->allowrepeat)
+ struct cmd_token *token = child->data;
+ if (!token->allowrepeat)
{
for (j = 0; j < stackpos; j++)
if (child == stack[j])
if (j != stackpos)
continue;
}
- struct cmd_token *token = child->data;
switch (token->type)
{
case OPTION_TKN:
if ((ctx->currnode = add_edge_dedup (ctx->currnode, $3)) != $3)
graph_delete_node (ctx->graph, $3);
- ctx->currnode->allowrepeat = 1;
+ ((struct cmd_token *)ctx->currnode->data)->allowrepeat = 1;
// adding a node as a child of itself accepts any number
// of the same token, which is what we want for variadics
{
vector from; // nodes which have edges to this node
vector to; // nodes which this node has edges to
- bool allowrepeat;
void *data; // node data
void (*del) (void *data); // deletion callback