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