4af0fbb1774c4d7bafea6794d9b772cb9c2b75fe
[carl9170fw.git] / config / confdata.c
1 /*
2  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3  * Released under the terms of the GNU GPL v2.0.
4  */
5
6 #include <sys/stat.h>
7 #include <ctype.h>
8 #include <errno.h>
9 #include <fcntl.h>
10 #include <stdarg.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <time.h>
15 #include <unistd.h>
16
17 #include "lkc.h"
18
19 struct conf_printer {
20         void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
21         void (*print_comment)(FILE *, const char *, void *);
22 };
23
24 static void conf_warning(const char *fmt, ...)
25         __attribute__ ((format (printf, 1, 2)));
26
27 static void conf_message(const char *fmt, ...)
28         __attribute__ ((format (printf, 1, 2)));
29
30 static const char *conf_filename;
31 static int conf_lineno, conf_warnings;
32
33 const char conf_defname[] = "include/generated/defconfig";
34
35 static void conf_warning(const char *fmt, ...)
36 {
37         va_list ap;
38         va_start(ap, fmt);
39         fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
40         vfprintf(stderr, fmt, ap);
41         fprintf(stderr, "\n");
42         va_end(ap);
43         conf_warnings++;
44 }
45
46 static void conf_default_message_callback(const char *fmt, va_list ap)
47 {
48         printf("#\n# ");
49         vprintf(fmt, ap);
50         printf("\n#\n");
51 }
52
53 static void (*conf_message_callback) (const char *fmt, va_list ap) =
54         conf_default_message_callback;
55 void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
56 {
57         conf_message_callback = fn;
58 }
59
60 static void conf_message(const char *fmt, ...)
61 {
62         va_list ap;
63
64         va_start(ap, fmt);
65         if (conf_message_callback)
66                 conf_message_callback(fmt, ap);
67         va_end(ap);
68 }
69
70 const char *conf_get_configname(void)
71 {
72         char *name = getenv("KCONFIG_CONFIG");
73
74         return name ? name : ".config";
75 }
76
77 const char *conf_get_autoconfig_name(void)
78 {
79         char *name = getenv("KCONFIG_AUTOCONFIG");
80
81         return name ? name : "include/generated/auto.conf";
82 }
83
84 char *conf_get_default_confname(void)
85 {
86         struct stat buf;
87         static char fullname[PATH_MAX+1];
88         char *env, *name;
89
90         name = expand_string(conf_defname);
91         env = getenv(SRCTREE);
92         if (env) {
93                 sprintf(fullname, "%s/%s", env, name);
94                 if (!stat(fullname, &buf))
95                         return fullname;
96         }
97         return name;
98 }
99
100 static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
101 {
102         char *p2;
103
104         switch (sym->type) {
105         case S_TRISTATE:
106                 if (p[0] == 'm') {
107                         sym->def[def].tri = mod;
108                         sym->flags |= def_flags;
109                         break;
110                 }
111                 /* fall through */
112         case S_BOOLEAN:
113                 if (p[0] == 'y') {
114                         sym->def[def].tri = yes;
115                         sym->flags |= def_flags;
116                         break;
117                 }
118                 if (p[0] == 'n') {
119                         sym->def[def].tri = no;
120                         sym->flags |= def_flags;
121                         break;
122                 }
123                 if (def != S_DEF_AUTO)
124                         conf_warning("symbol value '%s' invalid for %s",
125                                      p, sym->name);
126                 return 1;
127         case S_OTHER:
128                 if (*p != '"') {
129                         for (p2 = p; *p2 && !isspace(*p2); p2++)
130                                 ;
131                         sym->type = S_STRING;
132                         goto done;
133                 }
134                 /* fall through */
135         case S_STRING:
136                 if (*p++ != '"')
137                         break;
138                 for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
139                         if (*p2 == '"') {
140                                 *p2 = 0;
141                                 break;
142                         }
143                         memmove(p2, p2 + 1, strlen(p2));
144                 }
145                 if (!p2) {
146                         if (def != S_DEF_AUTO)
147                                 conf_warning("invalid string found");
148                         return 1;
149                 }
150                 /* fall through */
151         case S_INT:
152         case S_HEX:
153         done:
154                 if (sym_string_valid(sym, p)) {
155                         sym->def[def].val = xstrdup(p);
156                         sym->flags |= def_flags;
157                 } else {
158                         if (def != S_DEF_AUTO)
159                                 conf_warning("symbol value '%s' invalid for %s",
160                                              p, sym->name);
161                         return 1;
162                 }
163                 break;
164         default:
165                 ;
166         }
167         return 0;
168 }
169
170 #define LINE_GROWTH 16
171 static int add_byte(int c, char **lineptr, size_t slen, size_t *n)
172 {
173         char *nline;
174         size_t new_size = slen + 1;
175         if (new_size > *n) {
176                 new_size += LINE_GROWTH - 1;
177                 new_size *= 2;
178                 nline = xrealloc(*lineptr, new_size);
179                 if (!nline)
180                         return -1;
181
182                 *lineptr = nline;
183                 *n = new_size;
184         }
185
186         (*lineptr)[slen] = c;
187
188         return 0;
189 }
190
191 static ssize_t compat_getline(char **lineptr, size_t *n, FILE *stream)
192 {
193         char *line = *lineptr;
194         size_t slen = 0;
195
196         for (;;) {
197                 int c = getc(stream);
198
199                 switch (c) {
200                 case '\n':
201                         if (add_byte(c, &line, slen, n) < 0)
202                                 goto e_out;
203                         slen++;
204                         /* fall through */
205                 case EOF:
206                         if (add_byte('\0', &line, slen, n) < 0)
207                                 goto e_out;
208                         *lineptr = line;
209                         if (slen == 0)
210                                 return -1;
211                         return slen;
212                 default:
213                         if (add_byte(c, &line, slen, n) < 0)
214                                 goto e_out;
215                         slen++;
216                 }
217         }
218
219 e_out:
220         line[slen-1] = '\0';
221         *lineptr = line;
222         return -1;
223 }
224
225 int conf_read_simple(const char *name, int def)
226 {
227         FILE *in = NULL;
228         char   *line = NULL;
229         size_t  line_asize = 0;
230         char *p, *p2;
231         struct symbol *sym;
232         int i, def_flags;
233
234         if (name) {
235                 in = zconf_fopen(name);
236         } else {
237                 struct property *prop;
238
239                 name = conf_get_configname();
240                 in = zconf_fopen(name);
241                 if (in)
242                         goto load;
243                 sym_add_change_count(1);
244                 if (!sym_defconfig_list)
245                         return 1;
246
247                 for_all_defaults(sym_defconfig_list, prop) {
248                         if (expr_calc_value(prop->visible.expr) == no ||
249                             prop->expr->type != E_SYMBOL)
250                                 continue;
251                         sym_calc_value(prop->expr->left.sym);
252                         name = sym_get_string_value(prop->expr->left.sym);
253                         in = zconf_fopen(name);
254                         if (in) {
255                                 conf_message("using defaults found in %s",
256                                          name);
257                                 goto load;
258                         }
259                 }
260         }
261         if (!in)
262                 return 1;
263
264 load:
265         conf_filename = name;
266         conf_lineno = 0;
267         conf_warnings = 0;
268
269         def_flags = SYMBOL_DEF << def;
270         for_all_symbols(i, sym) {
271                 sym->flags |= SYMBOL_CHANGED;
272                 sym->flags &= ~(def_flags|SYMBOL_VALID);
273                 if (sym_is_choice(sym))
274                         sym->flags |= def_flags;
275                 switch (sym->type) {
276                 case S_INT:
277                 case S_HEX:
278                 case S_STRING:
279                         if (sym->def[def].val)
280                                 free(sym->def[def].val);
281                         /* fall through */
282                 default:
283                         sym->def[def].val = NULL;
284                         sym->def[def].tri = no;
285                 }
286         }
287
288         while (compat_getline(&line, &line_asize, in) != -1) {
289                 conf_lineno++;
290                 sym = NULL;
291                 if (line[0] == '#') {
292                         if (memcmp(line + 2, CONFIG_, strlen(CONFIG_)))
293                                 continue;
294                         p = strchr(line + 2 + strlen(CONFIG_), ' ');
295                         if (!p)
296                                 continue;
297                         *p++ = 0;
298                         if (strncmp(p, "is not set", 10))
299                                 continue;
300                         if (def == S_DEF_USER) {
301                                 sym = sym_find(line + 2 + strlen(CONFIG_));
302                                 if (!sym) {
303                                         sym_add_change_count(1);
304                                         goto setsym;
305                                 }
306                         } else {
307                                 sym = sym_lookup(line + 2 + strlen(CONFIG_), 0);
308                                 if (sym->type == S_UNKNOWN)
309                                         sym->type = S_BOOLEAN;
310                         }
311                         if (sym->flags & def_flags) {
312                                 conf_warning("override: reassigning to symbol %s", sym->name);
313                         }
314                         switch (sym->type) {
315                         case S_BOOLEAN:
316                         case S_TRISTATE:
317                                 sym->def[def].tri = no;
318                                 sym->flags |= def_flags;
319                                 break;
320                         default:
321                                 ;
322                         }
323                 } else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) {
324                         p = strchr(line + strlen(CONFIG_), '=');
325                         if (!p)
326                                 continue;
327                         *p++ = 0;
328                         p2 = strchr(p, '\n');
329                         if (p2) {
330                                 *p2-- = 0;
331                                 if (*p2 == '\r')
332                                         *p2 = 0;
333                         }
334                         if (def == S_DEF_USER) {
335                                 sym = sym_find(line + strlen(CONFIG_));
336                                 if (!sym) {
337                                         sym_add_change_count(1);
338                                         goto setsym;
339                                 }
340                         } else {
341                                 sym = sym_lookup(line + strlen(CONFIG_), 0);
342                                 if (sym->type == S_UNKNOWN)
343                                         sym->type = S_OTHER;
344                         }
345                         if (sym->flags & def_flags) {
346                                 conf_warning("override: reassigning to symbol %s", sym->name);
347                         }
348                         if (conf_set_sym_val(sym, def, def_flags, p))
349                                 continue;
350                 } else {
351                         if (line[0] != '\r' && line[0] != '\n')
352                                 conf_warning("unexpected data: %.*s",
353                                              (int)strcspn(line, "\r\n"), line);
354
355                         continue;
356                 }
357 setsym:
358                 if (sym && sym_is_choice_value(sym)) {
359                         struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
360                         switch (sym->def[def].tri) {
361                         case no:
362                                 break;
363                         case mod:
364                                 if (cs->def[def].tri == yes) {
365                                         conf_warning("%s creates inconsistent choice state", sym->name);
366                                         cs->flags &= ~def_flags;
367                                 }
368                                 break;
369                         case yes:
370                                 if (cs->def[def].tri != no)
371                                         conf_warning("override: %s changes choice state", sym->name);
372                                 cs->def[def].val = sym;
373                                 break;
374                         }
375                         cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
376                 }
377         }
378         free(line);
379         fclose(in);
380         return 0;
381 }
382
383 int conf_read(const char *name)
384 {
385         struct symbol *sym;
386         int conf_unsaved = 0;
387         int i;
388
389         sym_set_change_count(0);
390
391         if (conf_read_simple(name, S_DEF_USER)) {
392                 sym_calc_value(modules_sym);
393                 return 1;
394         }
395
396         sym_calc_value(modules_sym);
397
398         for_all_symbols(i, sym) {
399                 sym_calc_value(sym);
400                 if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
401                         continue;
402                 if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
403                         /* check that calculated value agrees with saved value */
404                         switch (sym->type) {
405                         case S_BOOLEAN:
406                         case S_TRISTATE:
407                                 if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
408                                         break;
409                                 if (!sym_is_choice(sym))
410                                         continue;
411                                 /* fall through */
412                         default:
413                                 if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
414                                         continue;
415                                 break;
416                         }
417                 } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
418                         /* no previous value and not saved */
419                         continue;
420                 conf_unsaved++;
421                 /* maybe print value in verbose mode... */
422         }
423
424         for_all_symbols(i, sym) {
425                 if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
426                         /* Reset values of generates values, so they'll appear
427                          * as new, if they should become visible, but that
428                          * doesn't quite work if the Kconfig and the saved
429                          * configuration disagree.
430                          */
431                         if (sym->visible == no && !conf_unsaved)
432                                 sym->flags &= ~SYMBOL_DEF_USER;
433                         switch (sym->type) {
434                         case S_STRING:
435                         case S_INT:
436                         case S_HEX:
437                                 /* Reset a string value if it's out of range */
438                                 if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
439                                         break;
440                                 sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
441                                 conf_unsaved++;
442                                 break;
443                         default:
444                                 break;
445                         }
446                 }
447         }
448
449         sym_add_change_count(conf_warnings || conf_unsaved);
450
451         return 0;
452 }
453
454 /*
455  * Kconfig configuration printer
456  *
457  * This printer is used when generating the resulting configuration after
458  * kconfig invocation and `defconfig' files. Unset symbol might be omitted by
459  * passing a non-NULL argument to the printer.
460  *
461  */
462 static void
463 kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
464 {
465
466         switch (sym->type) {
467         case S_BOOLEAN:
468         case S_TRISTATE:
469                 if (*value == 'n') {
470                         bool skip_unset = (arg != NULL);
471
472                         if (!skip_unset)
473                                 fprintf(fp, "# %s%s is not set\n",
474                                     CONFIG_, sym->name);
475                         return;
476                 }
477                 break;
478         default:
479                 break;
480         }
481
482         fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value);
483 }
484
485 static void
486 kconfig_print_cmake_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
487 {
488
489         switch (sym->type) {
490         case S_BOOLEAN:
491         case S_TRISTATE:
492                 if (*value == 'n') {
493                         bool skip_unset = (arg != NULL);
494
495                         if (!skip_unset)
496                                 fprintf(fp, "set(%s%s false)\n",
497                                         CONFIG_, sym->name, value);
498                         return;
499                 } else if (*value == 'm') {
500                         abort();
501                 } else {
502                         fprintf(fp, "set(%s%s true)\n", CONFIG_, sym->name, value);
503                 }
504                 break;
505         case S_HEX: {
506                 const char *prefix = "";
507
508                 if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
509                         prefix = "0x";
510                 fprintf(fp, "set(%s%s %s%s)\n",
511                     CONFIG_, sym->name, prefix, value);
512                 break;
513         }
514         case S_STRING:
515         case S_INT:
516                 fprintf(fp, "set(%s%s %s)\n",
517                     CONFIG_, sym->name, value);
518                 break;
519         default:
520                 break;
521         }
522
523 }
524
525 static void
526 kconfig_print_comment(FILE *fp, const char *value, void *arg)
527 {
528         const char *p = value;
529         size_t l;
530
531         for (;;) {
532                 l = strcspn(p, "\n");
533                 fprintf(fp, "#");
534                 if (l) {
535                         fprintf(fp, " ");
536                         xfwrite(p, l, 1, fp);
537                         p += l;
538                 }
539                 fprintf(fp, "\n");
540                 if (*p++ == '\0')
541                         break;
542         }
543 }
544
545 static struct conf_printer kconfig_printer_cb =
546 {
547         .print_symbol = kconfig_print_symbol,
548         .print_comment = kconfig_print_comment,
549 };
550
551 static struct conf_printer kconfig_printer_cmake_cb =
552 {
553         .print_symbol = kconfig_print_cmake_symbol,
554         .print_comment = kconfig_print_comment,
555 };
556
557 /*
558  * Header printer
559  *
560  * This printer is used when generating the `include/generated/autoconf.h' file.
561  */
562 static void
563 header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
564 {
565
566         switch (sym->type) {
567         case S_BOOLEAN:
568         case S_TRISTATE: {
569                 const char *suffix = "";
570
571                 switch (*value) {
572                 case 'n':
573                         break;
574                 case 'm':
575                         suffix = "_MODULE";
576                         /* fall through */
577                 default:
578                         fprintf(fp, "#define %s%s%s 1\n",
579                             CONFIG_, sym->name, suffix);
580                 }
581                 break;
582         }
583         case S_HEX: {
584                 const char *prefix = "";
585
586                 if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
587                         prefix = "0x";
588                 fprintf(fp, "#define %s%s %s%s\n",
589                     CONFIG_, sym->name, prefix, value);
590                 break;
591         }
592         case S_STRING:
593         case S_INT:
594                 fprintf(fp, "#define %s%s %s\n",
595                     CONFIG_, sym->name, value);
596                 break;
597         default:
598                 break;
599         }
600
601 }
602
603 static void
604 header_print_comment(FILE *fp, const char *value, void *arg)
605 {
606         const char *p = value;
607         size_t l;
608
609         fprintf(fp, "/*\n");
610         for (;;) {
611                 l = strcspn(p, "\n");
612                 fprintf(fp, " *");
613                 if (l) {
614                         fprintf(fp, " ");
615                         xfwrite(p, l, 1, fp);
616                         p += l;
617                 }
618                 fprintf(fp, "\n");
619                 if (*p++ == '\0')
620                         break;
621         }
622         fprintf(fp, " */\n");
623 }
624
625 static struct conf_printer header_printer_cb =
626 {
627         .print_symbol = header_print_symbol,
628         .print_comment = header_print_comment,
629 };
630
631 /*
632  * Tristate printer
633  *
634  * This printer is used when generating the `include/generated/tristate.conf' file.
635  */
636 static void
637 tristate_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
638 {
639
640         if (sym->type == S_TRISTATE && *value != 'n')
641                 fprintf(fp, "%s%s=%c\n", CONFIG_, sym->name, (char)toupper(*value));
642 }
643
644 static struct conf_printer tristate_printer_cb =
645 {
646         .print_symbol = tristate_print_symbol,
647         .print_comment = kconfig_print_comment,
648 };
649
650 static void conf_write_symbol(FILE *fp, struct symbol *sym,
651                               struct conf_printer *printer, void *printer_arg)
652 {
653         const char *str;
654
655         switch (sym->type) {
656         case S_OTHER:
657         case S_UNKNOWN:
658                 break;
659         case S_STRING:
660                 str = sym_get_string_value(sym);
661                 str = sym_escape_string_value(str);
662                 printer->print_symbol(fp, sym, str, printer_arg);
663                 free((void *)str);
664                 break;
665         default:
666                 str = sym_get_string_value(sym);
667                 printer->print_symbol(fp, sym, str, printer_arg);
668         }
669 }
670
671 static void
672 conf_write_heading(FILE *fp, struct conf_printer *printer, void *printer_arg)
673 {
674         char buf[256];
675
676         snprintf(buf, sizeof(buf),
677             "\n"
678             "Automatically generated file; DO NOT EDIT.\n"
679             "%s\n",
680             rootmenu.prompt->text);
681
682         printer->print_comment(fp, buf, printer_arg);
683 }
684
685 /*
686  * Write out a minimal config.
687  * All values that has default values are skipped as this is redundant.
688  */
689 int conf_write_defconfig(const char *filename)
690 {
691         struct symbol *sym;
692         struct menu *menu;
693         FILE *out;
694
695         out = fopen(filename, "w");
696         if (!out)
697                 return 1;
698
699         sym_clear_all_valid();
700
701         /* Traverse all menus to find all relevant symbols */
702         menu = rootmenu.list;
703
704         while (menu != NULL)
705         {
706                 sym = menu->sym;
707                 if (sym == NULL) {
708                         if (!menu_is_visible(menu))
709                                 goto next_menu;
710                 } else if (!sym_is_choice(sym)) {
711                         sym_calc_value(sym);
712                         if (!(sym->flags & SYMBOL_WRITE))
713                                 goto next_menu;
714                         sym->flags &= ~SYMBOL_WRITE;
715                         /* If we cannot change the symbol - skip */
716                         if (!sym_is_changable(sym))
717                                 goto next_menu;
718                         /* If symbol equals to default value - skip */
719                         if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
720                                 goto next_menu;
721
722                         /*
723                          * If symbol is a choice value and equals to the
724                          * default for a choice - skip.
725                          * But only if value is bool and equal to "y" and
726                          * choice is not "optional".
727                          * (If choice is "optional" then all values can be "n")
728                          */
729                         if (sym_is_choice_value(sym)) {
730                                 struct symbol *cs;
731                                 struct symbol *ds;
732
733                                 cs = prop_get_symbol(sym_get_choice_prop(sym));
734                                 ds = sym_choice_default(cs);
735                                 if (!sym_is_optional(cs) && sym == ds) {
736                                         if ((sym->type == S_BOOLEAN) &&
737                                             sym_get_tristate_value(sym) == yes)
738                                                 goto next_menu;
739                                 }
740                         }
741                         conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
742                 }
743 next_menu:
744                 if (menu->list != NULL) {
745                         menu = menu->list;
746                 }
747                 else if (menu->next != NULL) {
748                         menu = menu->next;
749                 } else {
750                         while ((menu = menu->parent)) {
751                                 if (menu->next != NULL) {
752                                         menu = menu->next;
753                                         break;
754                                 }
755                         }
756                 }
757         }
758         fclose(out);
759         return 0;
760 }
761
762 int conf_write(const char *name)
763 {
764         FILE *out;
765         struct symbol *sym;
766         struct menu *menu;
767         const char *basename;
768         const char *str;
769         char dirname[PATH_MAX+1], tmpname[PATH_MAX+22], newname[PATH_MAX+8];
770         char *env;
771
772         dirname[0] = 0;
773         if (name && name[0]) {
774                 struct stat st;
775                 char *slash;
776
777                 if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
778                         strcpy(dirname, name);
779                         strcat(dirname, "/");
780                         basename = conf_get_configname();
781                 } else if ((slash = strrchr(name, '/'))) {
782                         int size = slash - name + 1;
783                         memcpy(dirname, name, size);
784                         dirname[size] = 0;
785                         if (slash[1])
786                                 basename = slash + 1;
787                         else
788                                 basename = conf_get_configname();
789                 } else
790                         basename = name;
791         } else
792                 basename = conf_get_configname();
793
794         sprintf(newname, "%s%s", dirname, basename);
795         env = getenv("KCONFIG_OVERWRITECONFIG");
796         if (!env || !*env) {
797                 sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
798                 out = fopen(tmpname, "w");
799         } else {
800                 *tmpname = 0;
801                 out = fopen(newname, "w");
802         }
803         if (!out)
804                 return 1;
805
806         conf_write_heading(out, &kconfig_printer_cb, NULL);
807
808         if (!conf_get_changed())
809                 sym_clear_all_valid();
810
811         menu = rootmenu.list;
812         while (menu) {
813                 sym = menu->sym;
814                 if (!sym) {
815                         if (!menu_is_visible(menu))
816                                 goto next;
817                         str = menu_get_prompt(menu);
818                         fprintf(out, "\n"
819                                      "#\n"
820                                      "# %s\n"
821                                      "#\n", str);
822                 } else if (!(sym->flags & SYMBOL_CHOICE)) {
823                         sym_calc_value(sym);
824                         if (!(sym->flags & SYMBOL_WRITE))
825                                 goto next;
826                         sym->flags &= ~SYMBOL_WRITE;
827
828                         conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
829                 }
830
831 next:
832                 if (menu->list) {
833                         menu = menu->list;
834                         continue;
835                 }
836                 if (menu->next)
837                         menu = menu->next;
838                 else while ((menu = menu->parent)) {
839                         if (menu->next) {
840                                 menu = menu->next;
841                                 break;
842                         }
843                 }
844         }
845         fclose(out);
846
847         if (*tmpname) {
848                 strcat(dirname, basename);
849                 strcat(dirname, ".old");
850                 rename(newname, dirname);
851                 if (rename(tmpname, newname))
852                         return 1;
853         }
854
855         conf_message("configuration written to %s", newname);
856
857         sym_set_change_count(0);
858
859         return 0;
860 }
861
862 static int conf_split_config(void)
863 {
864         const char *name;
865         char path[PATH_MAX+1];
866         char *s, *d, c;
867         struct symbol *sym;
868         struct stat sb;
869         int res, i, fd;
870
871         name = conf_get_autoconfig_name();
872         conf_read_simple(name, S_DEF_AUTO);
873         sym_calc_value(modules_sym);
874
875         if (chdir("include/generated"))
876                 return 1;
877
878         res = 0;
879         for_all_symbols(i, sym) {
880                 sym_calc_value(sym);
881                 if ((sym->flags & SYMBOL_AUTO) || !sym->name)
882                         continue;
883                 if (sym->flags & SYMBOL_WRITE) {
884                         if (sym->flags & SYMBOL_DEF_AUTO) {
885                                 /*
886                                  * symbol has old and new value,
887                                  * so compare them...
888                                  */
889                                 switch (sym->type) {
890                                 case S_BOOLEAN:
891                                 case S_TRISTATE:
892                                         if (sym_get_tristate_value(sym) ==
893                                             sym->def[S_DEF_AUTO].tri)
894                                                 continue;
895                                         break;
896                                 case S_STRING:
897                                 case S_HEX:
898                                 case S_INT:
899                                         if (!strcmp(sym_get_string_value(sym),
900                                                     sym->def[S_DEF_AUTO].val))
901                                                 continue;
902                                         break;
903                                 default:
904                                         break;
905                                 }
906                         } else {
907                                 /*
908                                  * If there is no old value, only 'no' (unset)
909                                  * is allowed as new value.
910                                  */
911                                 switch (sym->type) {
912                                 case S_BOOLEAN:
913                                 case S_TRISTATE:
914                                         if (sym_get_tristate_value(sym) == no)
915                                                 continue;
916                                         break;
917                                 default:
918                                         break;
919                                 }
920                         }
921                 } else if (!(sym->flags & SYMBOL_DEF_AUTO))
922                         /* There is neither an old nor a new value. */
923                         continue;
924                 /* else
925                  *      There is an old value, but no new value ('no' (unset)
926                  *      isn't saved in auto.conf, so the old value is always
927                  *      different from 'no').
928                  */
929
930                 /* Replace all '_' and append ".h" */
931                 s = sym->name;
932                 d = path;
933                 while ((c = *s++)) {
934                         c = tolower(c);
935                         *d++ = (c == '_') ? '/' : c;
936                 }
937                 strcpy(d, ".h");
938
939                 /* Assume directory path already exists. */
940                 fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
941                 if (fd == -1) {
942                         if (errno != ENOENT) {
943                                 res = 1;
944                                 break;
945                         }
946                         /*
947                          * Create directory components,
948                          * unless they exist already.
949                          */
950                         d = path;
951                         while ((d = strchr(d, '/'))) {
952                                 *d = 0;
953                                 if (stat(path, &sb) && mkdir(path, 0755)) {
954                                         res = 1;
955                                         goto out;
956                                 }
957                                 *d++ = '/';
958                         }
959                         /* Try it again. */
960                         fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
961                         if (fd == -1) {
962                                 res = 1;
963                                 break;
964                         }
965                 }
966                 close(fd);
967         }
968 out:
969         if (chdir("../.."))
970                 return 1;
971
972         return res;
973 }
974
975 int conf_write_autoconf(void)
976 {
977         struct symbol *sym;
978         const char *name;
979         FILE *out, *tristate, *out_h, *out_c;
980         int i;
981
982         sym_clear_all_valid();
983
984         file_write_dep("include/generated/auto.conf.cmd");
985
986         if (conf_split_config())
987                 return 1;
988
989         out = fopen(".tmpconfig", "w");
990         if (!out)
991                 return 1;
992
993         tristate = fopen(".tmpconfig_tristate", "w");
994         if (!tristate) {
995                 fclose(out);
996                 return 1;
997         }
998
999         out_h = fopen(".tmpconfig.h", "w");
1000         if (!out_h) {
1001                 fclose(out);
1002                 fclose(tristate);
1003                 return 1;
1004         }
1005
1006         out_c = fopen(".tmpconfig.cmake", "w");
1007         if (!out_c) {
1008                 fclose(out);
1009                 fclose(tristate);
1010                 fclose(out_h);
1011         }
1012
1013         conf_write_heading(out, &kconfig_printer_cb, NULL);
1014
1015         conf_write_heading(tristate, &tristate_printer_cb, NULL);
1016
1017         conf_write_heading(out_h, &header_printer_cb, NULL);
1018
1019         conf_write_heading(out_c, &kconfig_printer_cmake_cb, NULL);
1020
1021         for_all_symbols(i, sym) {
1022                 sym_calc_value(sym);
1023                 if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
1024                         continue;
1025
1026                 /* write symbol to auto.conf, tristate and header files */
1027                 conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1);
1028
1029                 conf_write_symbol(tristate, sym, &tristate_printer_cb, (void *)1);
1030
1031                 conf_write_symbol(out_h, sym, &header_printer_cb, NULL);
1032
1033                 conf_write_symbol(out_c, sym, &kconfig_printer_cmake_cb, NULL);
1034         }
1035         fclose(out);
1036         fclose(tristate);
1037         fclose(out_h);
1038         fclose(out_c);
1039
1040         name = getenv("KCONFIG_AUTOHEADER");
1041         if (!name)
1042                 name = "include/generated/autoconf.h";
1043         if (rename(".tmpconfig.h", name))
1044                 return 1;
1045         name = getenv("KCONFIG_TRISTATE");
1046         if (!name)
1047                 name = "include/generated/tristate.conf";
1048         if (rename(".tmpconfig_tristate", name))
1049                 return 1;
1050         name = getenv("KCONFIG_CMAKE");
1051         if (!name)
1052                 name = "config.cmake";
1053         if (rename(".tmpconfig.cmake", name))
1054                 return 1;
1055         name = conf_get_autoconfig_name();
1056         /*
1057          * This must be the last step, kbuild has a dependency on auto.conf
1058          * and this marks the successful completion of the previous steps.
1059          */
1060         if (rename(".tmpconfig", name))
1061                 return 1;
1062
1063         return 0;
1064 }
1065
1066 static int sym_change_count;
1067 static void (*conf_changed_callback)(void);
1068
1069 void sym_set_change_count(int count)
1070 {
1071         int _sym_change_count = sym_change_count;
1072         sym_change_count = count;
1073         if (conf_changed_callback &&
1074             (bool)_sym_change_count != (bool)count)
1075                 conf_changed_callback();
1076 }
1077
1078 void sym_add_change_count(int count)
1079 {
1080         sym_set_change_count(count + sym_change_count);
1081 }
1082
1083 bool conf_get_changed(void)
1084 {
1085         return sym_change_count;
1086 }
1087
1088 void conf_set_changed_callback(void (*fn)(void))
1089 {
1090         conf_changed_callback = fn;
1091 }
1092
1093 static bool randomize_choice_values(struct symbol *csym)
1094 {
1095         struct property *prop;
1096         struct symbol *sym;
1097         struct expr *e;
1098         int cnt, def;
1099
1100         /*
1101          * If choice is mod then we may have more items selected
1102          * and if no then no-one.
1103          * In both cases stop.
1104          */
1105         if (csym->curr.tri != yes)
1106                 return false;
1107
1108         prop = sym_get_choice_prop(csym);
1109
1110         /* count entries in choice block */
1111         cnt = 0;
1112         expr_list_for_each_sym(prop->expr, e, sym)
1113                 cnt++;
1114
1115         /*
1116          * find a random value and set it to yes,
1117          * set the rest to no so we have only one set
1118          */
1119         def = (rand() % cnt);
1120
1121         cnt = 0;
1122         expr_list_for_each_sym(prop->expr, e, sym) {
1123                 if (def == cnt++) {
1124                         sym->def[S_DEF_USER].tri = yes;
1125                         csym->def[S_DEF_USER].val = sym;
1126                 }
1127                 else {
1128                         sym->def[S_DEF_USER].tri = no;
1129                 }
1130                 sym->flags |= SYMBOL_DEF_USER;
1131                 /* clear VALID to get value calculated */
1132                 sym->flags &= ~SYMBOL_VALID;
1133         }
1134         csym->flags |= SYMBOL_DEF_USER;
1135         /* clear VALID to get value calculated */
1136         csym->flags &= ~(SYMBOL_VALID);
1137
1138         return true;
1139 }
1140
1141 void set_all_choice_values(struct symbol *csym)
1142 {
1143         struct property *prop;
1144         struct symbol *sym;
1145         struct expr *e;
1146
1147         prop = sym_get_choice_prop(csym);
1148
1149         /*
1150          * Set all non-assinged choice values to no
1151          */
1152         expr_list_for_each_sym(prop->expr, e, sym) {
1153                 if (!sym_has_value(sym))
1154                         sym->def[S_DEF_USER].tri = no;
1155         }
1156         csym->flags |= SYMBOL_DEF_USER;
1157         /* clear VALID to get value calculated */
1158         csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);
1159 }
1160
1161 bool conf_set_all_new_symbols(enum conf_def_mode mode)
1162 {
1163         struct symbol *sym, *csym;
1164         int i, cnt, pby, pty, ptm;      /* pby: probability of bool     = y
1165                                          * pty: probability of tristate = y
1166                                          * ptm: probability of tristate = m
1167                                          */
1168
1169         pby = 50; pty = ptm = 33; /* can't go as the default in switch-case
1170                                    * below, otherwise gcc whines about
1171                                    * -Wmaybe-uninitialized */
1172         if (mode == def_random) {
1173                 int n, p[3];
1174                 char *env = getenv("KCONFIG_PROBABILITY");
1175                 n = 0;
1176                 while( env && *env ) {
1177                         char *endp;
1178                         int tmp = strtol( env, &endp, 10 );
1179                         if( tmp >= 0 && tmp <= 100 ) {
1180                                 p[n++] = tmp;
1181                         } else {
1182                                 errno = ERANGE;
1183                                 perror( "KCONFIG_PROBABILITY" );
1184                                 exit( 1 );
1185                         }
1186                         env = (*endp == ':') ? endp+1 : endp;
1187                         if( n >=3 ) {
1188                                 break;
1189                         }
1190                 }
1191                 switch( n ) {
1192                 case 1:
1193                         pby = p[0]; ptm = pby/2; pty = pby-ptm;
1194                         break;
1195                 case 2:
1196                         pty = p[0]; ptm = p[1]; pby = pty + ptm;
1197                         break;
1198                 case 3:
1199                         pby = p[0]; pty = p[1]; ptm = p[2];
1200                         break;
1201                 }
1202
1203                 if( pty+ptm > 100 ) {
1204                         errno = ERANGE;
1205                         perror( "KCONFIG_PROBABILITY" );
1206                         exit( 1 );
1207                 }
1208         }
1209         bool has_changed = false;
1210
1211         for_all_symbols(i, sym) {
1212                 if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
1213                         continue;
1214                 switch (sym_get_type(sym)) {
1215                 case S_BOOLEAN:
1216                 case S_TRISTATE:
1217                         has_changed = true;
1218                         switch (mode) {
1219                         case def_yes:
1220                                 sym->def[S_DEF_USER].tri = yes;
1221                                 break;
1222                         case def_mod:
1223                                 sym->def[S_DEF_USER].tri = mod;
1224                                 break;
1225                         case def_no:
1226                                 if (sym->flags & SYMBOL_ALLNOCONFIG_Y)
1227                                         sym->def[S_DEF_USER].tri = yes;
1228                                 else
1229                                         sym->def[S_DEF_USER].tri = no;
1230                                 break;
1231                         case def_random:
1232                                 sym->def[S_DEF_USER].tri = no;
1233                                 cnt = rand() % 100;
1234                                 if (sym->type == S_TRISTATE) {
1235                                         if (cnt < pty)
1236                                                 sym->def[S_DEF_USER].tri = yes;
1237                                         else if (cnt < (pty+ptm))
1238                                                 sym->def[S_DEF_USER].tri = mod;
1239                                 } else if (cnt < pby)
1240                                         sym->def[S_DEF_USER].tri = yes;
1241                                 break;
1242                         default:
1243                                 continue;
1244                         }
1245                         if (!(sym_is_choice(sym) && mode == def_random))
1246                                 sym->flags |= SYMBOL_DEF_USER;
1247                         break;
1248                 default:
1249                         break;
1250                 }
1251
1252         }
1253
1254         sym_clear_all_valid();
1255
1256         /*
1257          * We have different type of choice blocks.
1258          * If curr.tri equals to mod then we can select several
1259          * choice symbols in one block.
1260          * In this case we do nothing.
1261          * If curr.tri equals yes then only one symbol can be
1262          * selected in a choice block and we set it to yes,
1263          * and the rest to no.
1264          */
1265         if (mode != def_random) {
1266                 for_all_symbols(i, csym) {
1267                         if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
1268                             sym_is_choice_value(csym))
1269                                 csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
1270                 }
1271         }
1272
1273         for_all_symbols(i, csym) {
1274                 if (sym_has_value(csym) || !sym_is_choice(csym))
1275                         continue;
1276
1277                 sym_calc_value(csym);
1278                 if (mode == def_random)
1279                         has_changed = randomize_choice_values(csym);
1280                 else {
1281                         set_all_choice_values(csym);
1282                         has_changed = true;
1283                 }
1284         }
1285
1286         return has_changed;
1287 }