diff options
author | Karel Kočí <cynerd@email.cz> | 2015-05-10 16:02:25 +0200 |
---|---|---|
committer | Karel Kočí <cynerd@email.cz> | 2015-05-10 16:02:25 +0200 |
commit | 0e28187dca6fe44c5a319045012d4e9927c6158f (patch) | |
tree | fe6c7806ee4be9f8d0647851fed0901662cc4b64 /scripts/permute/menudata.c | |
parent | 0c6cc6cda623575b2bafa0c5f959b4289e94fd5b (diff) | |
download | linux-conf-perf-0e28187dca6fe44c5a319045012d4e9927c6158f.tar.gz linux-conf-perf-0e28187dca6fe44c5a319045012d4e9927c6158f.tar.bz2 linux-conf-perf-0e28187dca6fe44c5a319045012d4e9927c6158f.zip |
Add saving and loading of dot_config file in permute program
Diffstat (limited to 'scripts/permute/menudata.c')
-rw-r--r-- | scripts/permute/menudata.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/scripts/permute/menudata.c b/scripts/permute/menudata.c new file mode 100644 index 0000000..c941552 --- /dev/null +++ b/scripts/permute/menudata.c @@ -0,0 +1,59 @@ +#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 menudata *) m->data)->subpermute = perm; + struct menu *prnt; + for (prnt = m->parent; prnt != NULL; prnt = prnt->parent) { + menudata_cal(prnt); + } + + 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 perm = true; + 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)) { + subperm = true; + } else { + perm = false; + } + } + if (m->data == NULL) + m->data = menudata_new(); + ((struct menudata *) m->data)->permute = perm && subperm; + ((struct menudata *) m->data)->subpermute = subperm; +} |