From 0e28187dca6fe44c5a319045012d4e9927c6158f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sun, 10 May 2015 16:02:25 +0200 Subject: Add saving and loading of dot_config file in permute program --- scripts/permute/dotconf.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 scripts/permute/dotconf.c (limited to 'scripts/permute/dotconf.c') diff --git a/scripts/permute/dotconf.c b/scripts/permute/dotconf.c new file mode 100644 index 0000000..aba607e --- /dev/null +++ b/scripts/permute/dotconf.c @@ -0,0 +1,104 @@ +#include "dotconf.h" + +bool dotconfig_read(void) { + FILE *f; + f = fopen(DOTCONFIG_FILE, "r"); + if (f == NULL) + return false; + + char buffer[READBUFFER_SIZE]; + while (fgets(buffer, READBUFFER_SIZE, f) != NULL) { + if (buffer[0] == '\0' || buffer[1] == '\0') + continue; + if (buffer[0] == '#') { + } else { + char *wstr = buffer + 7; + char *end = strchr(wstr, '='); + *end = '\0'; + struct symbol *sym = sym_find(wstr); + if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) + continue; + struct property *prop; + for_all_prompts(sym, prop) { + if (prop->menu->data == NULL) + prop->menu->data = menudata_new(); + } + } + } + + fclose(f); + + struct menu *wmenu; + struct menu **stack; + size_t stack_size = 2, stack_pos = 0; + stack = malloc(stack_size * sizeof(struct menu *)); + wmenu = rootmenu.list; + while (wmenu != NULL) { + if (wmenu->list != NULL) { + if (stack_pos >= stack_size) { + stack_size *= 2; + stack = realloc(stack, stack_size * sizeof(struct menu *)); + } + stack[stack_pos++] = wmenu->list; + } + if (wmenu->data == NULL) { + if (wmenu->sym == NULL || wmenu->sym->name == NULL) { + wmenu->data = menudata_new(); + } else { + wmenu->data = menudata_new(); + menudata_set_permute(wmenu, true); + } + } + wmenu = wmenu->next; + if (wmenu == NULL && stack_pos > 0) + wmenu = stack[--stack_pos]; + } + while (wmenu != NULL) { + if (wmenu->list != NULL) + stack[stack_pos++] = wmenu->list; + if (wmenu->data == NULL) { + if (wmenu->sym == NULL || wmenu->sym->name == NULL) { + wmenu->data = menudata_new(); + } else { + wmenu->data = menudata_new(); + menudata_set_permute(wmenu, true); + } + } + wmenu = wmenu->next; + if (wmenu == NULL && stack_pos > 0) + wmenu = stack[--stack_pos]; + } + + return true; +} + +void dotconfig_write(void) { + FILE *f; + f = fopen(DOTCONFIG_FILE, "w"); + + struct symbol *sym; + struct property *prop; + int i; + unsigned variable = 0, fixed = 0; + for_all_symbols(i, sym) + if ((sym->type == S_BOOLEAN || sym->type == S_TRISTATE) + && sym->name != NULL) { + for_all_prompts(sym, prop) { + if (prop->menu->data == NULL + || !((struct menudata *) prop->menu->data)->permute) { + fprintf(f, "CONFIG_%s=%s\n", sym->name, + sym_get_tristate_value(sym) == no ? "n" : "y"); + fixed++; + break; + } else { + variable++; + printf("%s\n=%s\n", sym->name, + sym_get_tristate_value(sym) == no ? "n" : "y"); + } + } + } + + printf("Variable: %d, Fixed: %d\n", variable, fixed); + + fclose(f); +} -- cgit v1.2.3