]>
git.proxmox.com Git - mirror_frr.git/blob - tools/permutations.c
2 * Generates all possible matching inputs for a command string.
4 * Copyright (C) 2016 Cumulus Networks, Inc.
6 * This file is part of GNU Zebra.
8 * GNU Zebra is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2, or (at your option) any
13 * GNU Zebra is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; see the file COPYING; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27 #define USAGE "usage: permutations <cmdstr>"
29 void permute(struct graph_node
*);
30 void pretty_print_graph(struct graph_node
*start
, int level
);
32 int main(int argc
, char *argv
[])
35 fprintf(stdout
, USAGE
"\n");
38 struct cmd_element
*cmd
= calloc(1, sizeof(struct cmd_element
));
39 cmd
->string
= strdup(argv
[1]);
41 struct graph
*graph
= graph_new();
42 struct cmd_token
*token
=
43 cmd_token_new(START_TKN
, cmd
->attr
, NULL
, NULL
);
44 graph_new_node(graph
, token
, NULL
);
45 cmd_graph_parse(graph
, cmd
);
47 permute(vector_slot(graph
->nodes
, 0));
50 void permute(struct graph_node
*start
)
52 static struct list
*position
= NULL
;
54 position
= list_new();
56 struct cmd_token
*stok
= start
->data
;
57 struct graph_node
*gnn
;
61 listnode_add(position
, start
);
62 for (unsigned int i
= 0; i
< vector_active(start
->to
); i
++) {
63 struct graph_node
*gn
= vector_slot(start
->to
, i
);
64 struct cmd_token
*tok
= gn
->data
;
65 if (tok
->attr
== CMD_ATTR_HIDDEN
66 || tok
->attr
== CMD_ATTR_DEPRECATED
)
68 else if (tok
->type
== END_TKN
|| gn
== start
) {
70 for (ALL_LIST_ELEMENTS_RO(position
, ln
, gnn
)) {
71 struct cmd_token
*tt
= gnn
->data
;
72 if (tt
->type
< SPECIAL_TKN
)
73 fprintf(stdout
, " %s", tt
->text
);
76 fprintf(stdout
, "...");
77 fprintf(stdout
, "\n");
80 if (stok
->type
== FORK_TKN
&& tok
->type
!= FORK_TKN
)
81 for (ALL_LIST_ELEMENTS_RO(position
, ln
, gnn
))
90 list_delete_node(position
, listtail(position
));