aboutsummaryrefslogtreecommitdiff
path: root/scripts/permute_conf
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/permute_conf')
-rw-r--r--scripts/permute_conf/.gitignore1
-rw-r--r--scripts/permute_conf/Makefile25
-rw-r--r--scripts/permute_conf/constlist.h7
-rw-r--r--scripts/permute_conf/dotconf.c108
-rw-r--r--scripts/permute_conf/dotconf.h19
-rw-r--r--scripts/permute_conf/menudata.c58
-rw-r--r--scripts/permute_conf/menudata.h20
-rw-r--r--scripts/permute_conf/permute_conf.c180
-rw-r--r--scripts/permute_conf/permutelist.h17
9 files changed, 435 insertions, 0 deletions
diff --git a/scripts/permute_conf/.gitignore b/scripts/permute_conf/.gitignore
new file mode 100644
index 0000000..7fe1c05
--- /dev/null
+++ b/scripts/permute_conf/.gitignore
@@ -0,0 +1 @@
+permute_conf
diff --git a/scripts/permute_conf/Makefile b/scripts/permute_conf/Makefile
new file mode 100644
index 0000000..e0f7cd2
--- /dev/null
+++ b/scripts/permute_conf/Makefile
@@ -0,0 +1,25 @@
+MAKEFLAGS += --no-builtin-rules
+.PHONY: all clean
+.SUFFIXES:
+
+all: permute_conf
+
+KCONFIG_PREFIX = ../shared/kconfig
+include $(KCONFIG_PREFIX)/files.mk
+
+SRC = permute_conf.c \
+ menudata.c \
+ dotconf.c
+OBJ = $(patsubst %.c,%.o,$(SRC))
+CFLAGS = -O0 -Wall -ggdb -DDEBUG
+INCLUDES = -I../shared
+
+%.o: %.c
+ gcc -c $(CFLAGS) -o $@ $^ $(INCLUDES)
+
+permute_conf: $(OBJ) $(KCONFIG_OBJ)
+ gcc -o $@ $^
+
+clean::
+ $(RM) $(OBJ)
+ $(RM) permute_conf
diff --git a/scripts/permute_conf/constlist.h b/scripts/permute_conf/constlist.h
new file mode 100644
index 0000000..01f172a
--- /dev/null
+++ b/scripts/permute_conf/constlist.h
@@ -0,0 +1,7 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifndef _CONSTLIST_H_
+#define _CONSTLIST_H_
+
+#endif /* _CONSTLIST_H_ */
diff --git a/scripts/permute_conf/dotconf.c b/scripts/permute_conf/dotconf.c
new file mode 100644
index 0000000..bf8e067
--- /dev/null
+++ b/scripts/permute_conf/dotconf.c
@@ -0,0 +1,108 @@
+#include "dotconf.h"
+
+void dotconfig_read(bool * reqsave) {
+ FILE *f;
+ f = fopen(DOTCONFIG_FILE, "r");
+ if (f == NULL) {
+ *reqsave = true;
+ return;
+ }
+
+ char buffer[READBUFFER_SIZE];
+ while (fgets(buffer, READBUFFER_SIZE, f) != NULL) {
+ if (buffer[0] == '\0' || buffer[1] == '\0')
+ continue;
+ if (buffer[0] != '#') {
+ 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;
+ if ((sym_get_tristate_value(sym) == yes && *(end + 1) != 'y')
+ || (sym_get_tristate_value(sym) == no
+ && *(end + 1) != 'n'))
+ *reqsave = true;
+ 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];
+ }
+}
+
+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++;
+ if (verbose_level > 1)
+ printf("%s=%s\n", sym->name,
+ sym_get_tristate_value(sym) == no ? "n" : "y");
+ }
+ }
+ }
+
+ printf("Variable: %d, Fixed: %d\n", variable, fixed);
+
+ fclose(f);
+}
diff --git a/scripts/permute_conf/dotconf.h b/scripts/permute_conf/dotconf.h
new file mode 100644
index 0000000..34fa8db
--- /dev/null
+++ b/scripts/permute_conf/dotconf.h
@@ -0,0 +1,19 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include <kconfig/lkc.h>
+#include <macros.h>
+#include "menudata.h"
+
+#ifndef _DOTCONF_H_
+#define _DOTCONF_H_
+
+#define DOTCONFIG_FILE "../dot_config"
+#define READBUFFER_SIZE 128
+
+void dotconfig_read(bool * reqsave);
+void dotconfig_write(void);
+
+#endif /* _DOTCONF_H_ */
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;
+ }
+ }
+}
diff --git a/scripts/permute_conf/menudata.h b/scripts/permute_conf/menudata.h
new file mode 100644
index 0000000..a273891
--- /dev/null
+++ b/scripts/permute_conf/menudata.h
@@ -0,0 +1,20 @@
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#include <kconfig/lkc.h>
+
+#ifndef _MENUDATA_H_
+#define _MENUDATA_H_
+
+struct menudata {
+ bool permute;
+ bool subpermute;
+};
+
+struct menudata *menudata_new(void);
+void menudata_set_permute(struct menu *m, bool perm);
+void menudata_set_all_permute(struct menu *m, bool perm);
+void menudata_cal(struct menu *m);
+
+#endif /* _MENUDATA_H_ */
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");
+ }
+}
diff --git a/scripts/permute_conf/permutelist.h b/scripts/permute_conf/permutelist.h
new file mode 100644
index 0000000..725f6d6
--- /dev/null
+++ b/scripts/permute_conf/permutelist.h
@@ -0,0 +1,17 @@
+#include <stdlib.h>
+#include <stdbool.h>
+#include <kconfig/lkc.h>
+
+#ifndef _PERMUTELIST_H_
+#define _PERMUTELIST_H_
+
+struct permutelist {
+ struct menu *permute;
+ size_t size, pos;
+};
+
+void permutelist_add(struct menu *m);
+void permutelist_remove(struct menu *m);
+bool permutelist_is_permute(struct menu *m);
+
+#endif /* _PERMUTELIST_H_ */