From 2c46c7e4b57604a299b0639560934e1f523f725a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Thu, 21 May 2015 19:24:24 +0200 Subject: Rename program permute to permute_conf --- scripts/permute_conf/menudata.c | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 scripts/permute_conf/menudata.c (limited to 'scripts/permute_conf/menudata.c') diff --git a/scripts/permute_conf/menudata.c b/scripts/permute_conf/menudata.c new file mode 100644 index 0000000..88910ab --- /dev/null +++ b/scripts/permute_conf/menudata.c @@ -0,0 +1,58 @@ +#include "menudata.h" + +struct menudata *menudata_new(void) { + struct menudata *rtn; + rtn = calloc(1, sizeof(struct menudata)); + return rtn; +} + +void menudata_set_permute(struct menu *m, bool perm) { + ((struct menudata *) m->data)->permute = perm; + struct menu *prnt; + for (prnt = m; prnt != NULL; prnt = prnt->parent) { + menudata_cal(prnt); + } +} + +void menudata_set_all_permute(struct menu *m, bool perm) { + menudata_set_permute(m, perm); + + struct menu **stack; + size_t stack_size = 2, stack_pos = 0; + stack = malloc(stack_size * sizeof(struct menu *)); + + m = m->list; + while (m != NULL) { + if (m->data == NULL) + m->data = menudata_new(); + ((struct menudata *) m->data)->permute = perm; + ((struct menudata *) m->data)->subpermute = perm; + + if (m->list != NULL) { + if (stack_pos >= stack_size) { + stack_size *= 2; + stack = realloc(stack, stack_size * sizeof(struct menu *)); + } + stack[stack_pos++] = m->list; + } + + m = m->next; + if (m == NULL && stack_pos > 0) + m = stack[--stack_pos]; + } + +} + +void menudata_cal(struct menu *m) { + bool subperm = false; + struct menu *w; + for (w = m->list; w != NULL; w = w->next) { + if (w->data != NULL && (((struct menudata *) w->data)->permute + || ((struct menudata *) w->data)-> + subpermute)) { + if (m->data == NULL) + m->data = menudata_new(); + ((struct menudata *) m->data)->subpermute = subperm; + } + } +} -- cgit v1.2.3