diff options
Diffstat (limited to 'scripts/permute_conf/permute_conf.c')
-rw-r--r-- | scripts/permute_conf/permute_conf.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/scripts/permute_conf/permute_conf.c b/scripts/permute_conf/permute_conf.c new file mode 100644 index 0000000..ec9abf0 --- /dev/null +++ b/scripts/permute_conf/permute_conf.c @@ -0,0 +1,180 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stdbool.h> +#include <string.h> +#include <locale.h> +#include <libintl.h> +#include <kconfig/lkc.h> +#include <macros.h> +#include <build_files.h> +#include "menudata.h" +#include "dotconf.h" + +#define INPUT_SIZE 1024 + +int verbose_level; +char *file; + +bool reqsave; + +void printf_help(void); +void exit_save(void); + +int main(int argc, char **argv) { + verbose_level = 1; + int i; + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-v")) + verbose_level++; + else if (file == NULL) + file = argv[i]; + else { + Eprintf("Unknown parameter: %s\n", argv[i]); + exit(1); + } + } + + if (file == NULL) { + Eprintf("No Kconfig input file specified\n"); + exit(2); + } + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + conf_parse(file); + conf_read(".config"); + + dotconfig_read(&reqsave); + + struct menu *wroot, *wmenu, *wwmenu; + wroot = &rootmenu; + int menucount; + char *input; + int inputi; + input = malloc(INPUT_SIZE * sizeof(char)); + + printf_help(); + + rootmenu.data = menudata_new(); + while (1) { + printf("\n%s\n", wroot->prompt->text); + wmenu = wroot->list; + menucount = 0; + while (wmenu != NULL) { + if (wmenu->prompt != NULL + && (wmenu->sym == NULL || wmenu->sym->type == S_BOOLEAN + || wmenu->sym->type == S_TRISTATE + || wmenu->sym->type == S_OTHER)) { + if (wmenu->data == NULL) + wmenu->data = menudata_new(); + printf("%3d", ++menucount); + if (((struct menudata *) wmenu->data)->permute) { + printf("<O>"); + } else if (((struct menudata *) wmenu->data)->subpermute) { + printf("<->"); + } else { + printf("<X>"); + } + if (wmenu->sym == NULL || sym_is_choice(wmenu->sym)) + printf(" %s -->\n", wmenu->prompt->text); + else + printf(" %s\n", wmenu->prompt->text); + } + wmenu = wmenu->next; + } + + input: + printf("Input: "); + fgets(input, INPUT_SIZE, stdin); + switch (input[0]) { + case 'e': + case 'v': + case 'f': + inputi = atoi(input + 1); + if (inputi <= 0 && inputi > menucount) + goto input; + int y = 0; + wwmenu = wroot->list; + while (1) { + if (wwmenu->prompt != NULL + && (wwmenu->sym == NULL + || wwmenu->sym->type == S_BOOLEAN + || wwmenu->sym->type == S_TRISTATE + || wwmenu->sym->type == S_OTHER)) + y++; + if (y >= inputi) + break; + wwmenu = wwmenu->next; + } + break; + case 'u': + if (wroot->parent == NULL) + goto input; + wroot = wroot->parent; + break; + case 's': + reqsave = false; + dotconfig_write(); + printf("Configuration saved...\n"); + case 'r': + break; + case 'q': + goto quit; + case 'h': + printf_help(); + default: + goto input; + } + switch (input[0]) { + case 'e': + if (wwmenu->list != NULL) + wroot = wwmenu; + else + goto input; + break; + case 'v': + if (input[1] == 'a') { + menudata_set_all_permute(wwmenu, true); + } else { + menudata_set_permute(wwmenu, true); + } + reqsave = true; + break; + case 'f': + menudata_set_permute(wwmenu, false); + reqsave = true; + break; + } + } + + quit: + exit_save(); + + return 0; +} + +void printf_help(void) { + printf("As input are accepted these commands:\n"); + printf(" e <NUM> Enter menu according to number.\n"); + printf(" u Go to previous upper menu.\n"); + printf(" v <NUM> Set config as variable.\n"); + printf(" va <NUM> Set menu and all its submenus as variable.\n"); + printf(" f <NUM> Set menu and all its submenus as fixed.\n"); + printf(" s Save settings.\n"); + printf(" r Reprint menu.\n"); + printf(" h Prints this text.\n"); + printf(" q Quit this program\n"); +} + +void exit_save(void) { + if (!reqsave) + return; + printf("Unsaved chages. Save (y/N): "); + int ch = fgetc(stdin); + if (ch == 'y' || ch == 'Y') { + dotconfig_write(); + printf("Configuration saved.\n"); + } +} |