]>
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
19 * along with GNU Zebra; see the file COPYING. If not, write to the Free
20 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
28 #define USAGE "usage: permutations <cmdstr>"
31 permute (struct graph_node
*);
33 pretty_print_graph (struct graph_node
*start
, int level
);
35 int main (int argc
, char *argv
[])
39 fprintf(stdout
, USAGE
"\n");
42 struct cmd_element
*cmd
= calloc (1, sizeof (struct cmd_element
));
43 cmd
->string
= strdup(argv
[1]);
45 struct graph
*graph
= graph_new();
46 struct cmd_token
*token
= new_cmd_token (START_TKN
, cmd
->attr
, NULL
, NULL
);
47 graph_new_node (graph
, token
, NULL
);
48 command_parse_format (graph
, cmd
);
50 permute (vector_slot (graph
->nodes
, 0));
51 pretty_print_graph (vector_slot (graph
->nodes
, 0), 0);
55 permute (struct graph_node
*start
)
57 static struct list
*position
= NULL
;
58 if (!position
) position
= list_new ();
61 listnode_add (position
, start
);
62 for (unsigned int i
= 0; i
< vector_active (start
->to
); i
++)
64 struct graph_node
*gn
= vector_slot (start
->to
, i
);
65 struct cmd_token
*tok
= gn
->data
;
66 if (tok
->type
== END_TKN
)
68 struct graph_node
*gnn
;
70 for (ALL_LIST_ELEMENTS_RO (position
,ln
,gnn
))
72 struct cmd_token
*tt
= gnn
->data
;
73 if (tt
->type
< SPECIAL_TKN
)
74 fprintf (stdout
, "%s ", tt
->text
);
76 fprintf (stdout
, "\n");
81 list_delete_node (position
, listtail(position
));
85 pretty_print_graph (struct graph_node
*start
, int level
)
88 struct cmd_token
*tok
= start
->data
;
89 fprintf (stdout
, "%s[%d] ", tok
->text
, tok
->type
);
91 int numto
= vector_active (start
->to
);
95 fprintf (stdout
, "\n");
96 for (unsigned int i
= 0; i
< vector_active (start
->to
); i
++)
98 struct graph_node
*adj
= vector_slot (start
->to
, i
);
99 // if we're listing multiple children, indent!
101 for (int j
= 0; j
< level
+1; j
++)
102 fprintf (stdout
, " ");
103 // if this node is a vararg, just print *
105 fprintf (stdout
, "*");
107 pretty_print_graph (adj
, numto
> 1 ? level
+1 : level
);
111 fprintf(stdout
, "\n");