Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


imported SEABIOS source tree
[palacios.git] / bios / seabios / tools / kconfig / 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 <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <time.h>
14 #include <unistd.h>
15
16 #define LKC_DIRECT_LINK
17 #include "lkc.h"
18
19 static void conf_warning(const char *fmt, ...)
20         __attribute__ ((format (printf, 1, 2)));
21
22 static void conf_message(const char *fmt, ...)
23         __attribute__ ((format (printf, 1, 2)));
24
25 static const char *conf_filename;
26 static int conf_lineno, conf_warnings, conf_unsaved;
27
28 const char conf_defname[] = "arch/$ARCH/defconfig";
29
30 static void conf_warning(const char *fmt, ...)
31 {
32         va_list ap;
33         va_start(ap, fmt);
34         fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
35         vfprintf(stderr, fmt, ap);
36         fprintf(stderr, "\n");
37         va_end(ap);
38         conf_warnings++;
39 }
40
41 static void conf_default_message_callback(const char *fmt, va_list ap)
42 {
43         printf("#\n# ");
44         vprintf(fmt, ap);
45         printf("\n#\n");
46 }
47
48 static void (*conf_message_callback) (const char *fmt, va_list ap) =
49         conf_default_message_callback;
50 void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
51 {
52         conf_message_callback = fn;
53 }
54
55 static void conf_message(const char *fmt, ...)
56 {
57         va_list ap;
58
59         va_start(ap, fmt);
60         if (conf_message_callback)
61                 conf_message_callback(fmt, ap);
62 }
63
64 const char *conf_get_configname(void)
65 {
66         char *name = getenv("KCONFIG_CONFIG");
67
68         return name ? name : ".config";
69 }
70
71 const char *conf_get_autoconfig_name(void)
72 {
73         char *name = getenv("KCONFIG_AUTOCONFIG");
74
75         return name ? name : "include/config/auto.conf";
76 }
77
78 static char *conf_expand_value(const char *in)
79 {
80         struct symbol *sym;
81         const char *src;
82         static char res_value[SYMBOL_MAXLENGTH];
83         char *dst, name[SYMBOL_MAXLENGTH];
84
85         res_value[0] = 0;
86         dst = name;
87         while ((src = strchr(in, '$'))) {
88                 strncat(res_value, in, src - in);
89                 src++;
90                 dst = name;
91                 while (isalnum(*src) || *src == '_')
92                         *dst++ = *src++;
93                 *dst = 0;
94                 sym = sym_lookup(name, 0);
95                 sym_calc_value(sym);
96                 strcat(res_value, sym_get_string_value(sym));
97                 in = src;
98         }
99         strcat(res_value, in);
100
101         return res_value;
102 }
103
104 char *conf_get_default_confname(void)
105 {
106         struct stat buf;
107         static char fullname[PATH_MAX+1];
108         char *env, *name;
109
110         name = conf_expand_value(conf_defname);
111         env = getenv(SRCTREE);
112         if (env) {
113                 sprintf(fullname, "%s/%s", env, name);
114                 if (!stat(fullname, &buf))
115                         return fullname;
116         }
117         return name;
118 }
119
120 static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
121 {
122         char *p2;
123
124         switch (sym->type) {
125         case S_TRISTATE:
126                 if (p[0] == 'm') {
127                         sym->def[def].tri = mod;
128                         sym->flags |= def_flags;
129                         break;
130                 }
131         case S_BOOLEAN:
132                 if (p[0] == 'y') {
133                         sym->def[def].tri = yes;
134                         sym->flags |= def_flags;
135                         break;
136                 }
137                 if (p[0] == 'n') {
138                         sym->def[def].tri = no;
139                         sym->flags |= def_flags;
140                         break;
141                 }
142                 conf_warning("symbol value '%s' invalid for %s", p, sym->name);
143                 break;
144         case S_OTHER:
145                 if (*p != '"') {
146                         for (p2 = p; *p2 && !isspace(*p2); p2++)
147                                 ;
148                         sym->type = S_STRING;
149                         goto done;
150                 }
151         case S_STRING:
152                 if (*p++ != '"')
153                         break;
154                 for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
155                         if (*p2 == '"') {
156                                 *p2 = 0;
157                                 break;
158                         }
159                         memmove(p2, p2 + 1, strlen(p2));
160                 }
161                 if (!p2) {
162                         conf_warning("invalid string found");
163                         return 1;
164                 }
165         case S_INT:
166         case S_HEX:
167         done:
168                 if (sym_string_valid(sym, p)) {
169                         sym->def[def].val = strdup(p);
170                         sym->flags |= def_flags;
171                 } else {
172                         conf_warning("symbol value '%s' invalid for %s", p, sym->name);
173                         return 1;
174                 }
175                 break;
176         default:
177                 ;
178         }
179         return 0;
180 }
181
182 int conf_read_simple(const char *name, int def)
183 {
184         FILE *in = NULL;
185         char line[1024];
186         char *p, *p2;
187         struct symbol *sym;
188         int i, def_flags;
189
190         if (name) {
191                 in = zconf_fopen(name);
192         } else {
193                 struct property *prop;
194
195                 name = conf_get_configname();
196                 in = zconf_fopen(name);
197                 if (in)
198                         goto load;
199                 sym_add_change_count(1);
200                 if (!sym_defconfig_list) {
201                         if (modules_sym)
202                                 sym_calc_value(modules_sym);
203                         return 1;
204                 }
205
206                 for_all_defaults(sym_defconfig_list, prop) {
207                         if (expr_calc_value(prop->visible.expr) == no ||
208                             prop->expr->type != E_SYMBOL)
209                                 continue;
210                         name = conf_expand_value(prop->expr->left.sym->name);
211                         in = zconf_fopen(name);
212                         if (in) {
213                                 conf_message(_("using defaults found in %s"),
214                                          name);
215                                 goto load;
216                         }
217                 }
218         }
219         if (!in)
220                 return 1;
221
222 load:
223         conf_filename = name;
224         conf_lineno = 0;
225         conf_warnings = 0;
226         conf_unsaved = 0;
227
228         def_flags = SYMBOL_DEF << def;
229         for_all_symbols(i, sym) {
230                 sym->flags |= SYMBOL_CHANGED;
231                 sym->flags &= ~(def_flags|SYMBOL_VALID);
232                 if (sym_is_choice(sym))
233                         sym->flags |= def_flags;
234                 switch (sym->type) {
235                 case S_INT:
236                 case S_HEX:
237                 case S_STRING:
238                         if (sym->def[def].val)
239                                 free(sym->def[def].val);
240                 default:
241                         sym->def[def].val = NULL;
242                         sym->def[def].tri = no;
243                 }
244         }
245
246         while (fgets(line, sizeof(line), in)) {
247                 conf_lineno++;
248                 sym = NULL;
249                 if (line[0] == '#') {
250                         if (memcmp(line + 2, CONFIG_, strlen(CONFIG_)))
251                                 continue;
252                         p = strchr(line + 2 + strlen(CONFIG_), ' ');
253                         if (!p)
254                                 continue;
255                         *p++ = 0;
256                         if (strncmp(p, "is not set", 10))
257                                 continue;
258                         if (def == S_DEF_USER) {
259                                 sym = sym_find(line + 2 + strlen(CONFIG_));
260                                 if (!sym) {
261                                         sym_add_change_count(1);
262                                         goto setsym;
263                                 }
264                         } else {
265                                 sym = sym_lookup(line + 2 + strlen(CONFIG_), 0);
266                                 if (sym->type == S_UNKNOWN)
267                                         sym->type = S_BOOLEAN;
268                         }
269                         if (sym->flags & def_flags) {
270                                 conf_warning("override: reassigning to symbol %s", sym->name);
271                         }
272                         switch (sym->type) {
273                         case S_BOOLEAN:
274                         case S_TRISTATE:
275                                 sym->def[def].tri = no;
276                                 sym->flags |= def_flags;
277                                 break;
278                         default:
279                                 ;
280                         }
281                 } else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) {
282                         p = strchr(line + strlen(CONFIG_), '=');
283                         if (!p)
284                                 continue;
285                         *p++ = 0;
286                         p2 = strchr(p, '\n');
287                         if (p2) {
288                                 *p2-- = 0;
289                                 if (*p2 == '\r')
290                                         *p2 = 0;
291                         }
292                         if (def == S_DEF_USER) {
293                                 sym = sym_find(line + strlen(CONFIG_));
294                                 if (!sym) {
295                                         sym_add_change_count(1);
296                                         goto setsym;
297                                 }
298                         } else {
299                                 sym = sym_lookup(line + strlen(CONFIG_), 0);
300                                 if (sym->type == S_UNKNOWN)
301                                         sym->type = S_OTHER;
302                         }
303                         if (sym->flags & def_flags) {
304                                 conf_warning("override: reassigning to symbol %s", sym->name);
305                         }
306                         if (conf_set_sym_val(sym, def, def_flags, p))
307                                 continue;
308                 } else {
309                         if (line[0] != '\r' && line[0] != '\n')
310                                 conf_warning("unexpected data");
311                         continue;
312                 }
313 setsym:
314                 if (sym && sym_is_choice_value(sym)) {
315                         struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
316                         switch (sym->def[def].tri) {
317                         case no:
318                                 break;
319                         case mod:
320                                 if (cs->def[def].tri == yes) {
321                                         conf_warning("%s creates inconsistent choice state", sym->name);
322                                         cs->flags &= ~def_flags;
323                                 }
324                                 break;
325                         case yes:
326                                 if (cs->def[def].tri != no)
327                                         conf_warning("override: %s changes choice state", sym->name);
328                                 cs->def[def].val = sym;
329                                 break;
330                         }
331                         cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
332                 }
333         }
334         fclose(in);
335
336         if (modules_sym)
337                 sym_calc_value(modules_sym);
338         return 0;
339 }
340
341 int conf_read(const char *name)
342 {
343         struct symbol *sym, *choice_sym;
344         struct property *prop;
345         struct expr *e;
346         int i, flags;
347
348         sym_set_change_count(0);
349
350         if (conf_read_simple(name, S_DEF_USER))
351                 return 1;
352
353         for_all_symbols(i, sym) {
354                 sym_calc_value(sym);
355                 if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
356                         goto sym_ok;
357                 if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
358                         /* check that calculated value agrees with saved value */
359                         switch (sym->type) {
360                         case S_BOOLEAN:
361                         case S_TRISTATE:
362                                 if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
363                                         break;
364                                 if (!sym_is_choice(sym))
365                                         goto sym_ok;
366                         default:
367                                 if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
368                                         goto sym_ok;
369                                 break;
370                         }
371                 } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
372                         /* no previous value and not saved */
373                         goto sym_ok;
374                 conf_unsaved++;
375                 /* maybe print value in verbose mode... */
376         sym_ok:
377                 if (!sym_is_choice(sym))
378                         continue;
379                 /* The choice symbol only has a set value (and thus is not new)
380                  * if all its visible childs have values.
381                  */
382                 prop = sym_get_choice_prop(sym);
383                 flags = sym->flags;
384                 expr_list_for_each_sym(prop->expr, e, choice_sym)
385                         if (choice_sym->visible != no)
386                                 flags &= choice_sym->flags;
387                 sym->flags &= flags | ~SYMBOL_DEF_USER;
388         }
389
390         for_all_symbols(i, sym) {
391                 if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
392                         /* Reset values of generates values, so they'll appear
393                          * as new, if they should become visible, but that
394                          * doesn't quite work if the Kconfig and the saved
395                          * configuration disagree.
396                          */
397                         if (sym->visible == no && !conf_unsaved)
398                                 sym->flags &= ~SYMBOL_DEF_USER;
399                         switch (sym->type) {
400                         case S_STRING:
401                         case S_INT:
402                         case S_HEX:
403                                 /* Reset a string value if it's out of range */
404                                 if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
405                                         break;
406                                 sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
407                                 conf_unsaved++;
408                                 break;
409                         default:
410                                 break;
411                         }
412                 }
413         }
414
415         sym_add_change_count(conf_warnings || conf_unsaved);
416
417         return 0;
418 }
419
420 /* Write a S_STRING */
421 static void conf_write_string(bool headerfile, const char *name,
422                               const char *str, FILE *out)
423 {
424         int l;
425         if (headerfile)
426                 fprintf(out, "#define %s%s \"", CONFIG_, name);
427         else
428                 fprintf(out, "%s%s=\"", CONFIG_, name);
429
430         while (1) {
431                 l = strcspn(str, "\"\\");
432                 if (l) {
433                         xfwrite(str, l, 1, out);
434                         str += l;
435                 }
436                 if (!*str)
437                         break;
438                 fprintf(out, "\\%c", *str++);
439         }
440         fputs("\"\n", out);
441 }
442
443 static void conf_write_symbol(struct symbol *sym, FILE *out, bool write_no)
444 {
445         const char *str;
446
447         switch (sym->type) {
448         case S_BOOLEAN:
449         case S_TRISTATE:
450                 switch (sym_get_tristate_value(sym)) {
451                 case no:
452                         if (write_no)
453                                 fprintf(out, "# %s%s is not set\n",
454                                     CONFIG_, sym->name);
455                         break;
456                 case mod:
457                         fprintf(out, "%s%s=m\n", CONFIG_, sym->name);
458                         break;
459                 case yes:
460                         fprintf(out, "%s%s=y\n", CONFIG_, sym->name);
461                         break;
462                 }
463                 break;
464         case S_STRING:
465                 conf_write_string(false, sym->name, sym_get_string_value(sym), out);
466                 break;
467         case S_HEX:
468         case S_INT:
469                 str = sym_get_string_value(sym);
470                 fprintf(out, "%s%s=%s\n", CONFIG_, sym->name, str);
471                 break;
472         case S_OTHER:
473         case S_UNKNOWN:
474                 break;
475         }
476 }
477
478 /*
479  * Write out a minimal config.
480  * All values that has default values are skipped as this is redundant.
481  */
482 int conf_write_defconfig(const char *filename)
483 {
484         struct symbol *sym;
485         struct menu *menu;
486         FILE *out;
487
488         out = fopen(filename, "w");
489         if (!out)
490                 return 1;
491
492         sym_clear_all_valid();
493
494         /* Traverse all menus to find all relevant symbols */
495         menu = rootmenu.list;
496
497         while (menu != NULL)
498         {
499                 sym = menu->sym;
500                 if (sym == NULL) {
501                         if (!menu_is_visible(menu))
502                                 goto next_menu;
503                 } else if (!sym_is_choice(sym)) {
504                         sym_calc_value(sym);
505                         if (!(sym->flags & SYMBOL_WRITE))
506                                 goto next_menu;
507                         sym->flags &= ~SYMBOL_WRITE;
508                         /* If we cannot change the symbol - skip */
509                         if (!sym_is_changable(sym))
510                                 goto next_menu;
511                         /* If symbol equals to default value - skip */
512                         if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
513                                 goto next_menu;
514
515                         /*
516                          * If symbol is a choice value and equals to the
517                          * default for a choice - skip.
518                          * But only if value is bool and equal to "y" and
519                          * choice is not "optional".
520                          * (If choice is "optional" then all values can be "n")
521                          */
522                         if (sym_is_choice_value(sym)) {
523                                 struct symbol *cs;
524                                 struct symbol *ds;
525
526                                 cs = prop_get_symbol(sym_get_choice_prop(sym));
527                                 ds = sym_choice_default(cs);
528                                 if (!sym_is_optional(cs) && sym == ds) {
529                                         if ((sym->type == S_BOOLEAN) &&
530                                             sym_get_tristate_value(sym) == yes)
531                                                 goto next_menu;
532                                 }
533                         }
534                         conf_write_symbol(sym, out, true);
535                 }
536 next_menu:
537                 if (menu->list != NULL) {
538                         menu = menu->list;
539                 }
540                 else if (menu->next != NULL) {
541                         menu = menu->next;
542                 } else {
543                         while ((menu = menu->parent)) {
544                                 if (menu->next != NULL) {
545                                         menu = menu->next;
546                                         break;
547                                 }
548                         }
549                 }
550         }
551         fclose(out);
552         return 0;
553 }
554
555 int conf_write(const char *name)
556 {
557         FILE *out;
558         struct symbol *sym;
559         struct menu *menu;
560         const char *basename;
561         const char *str;
562         char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1];
563         time_t now;
564         int use_timestamp = 1;
565         char *env;
566
567         dirname[0] = 0;
568         if (name && name[0]) {
569                 struct stat st;
570                 char *slash;
571
572                 if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
573                         strcpy(dirname, name);
574                         strcat(dirname, "/");
575                         basename = conf_get_configname();
576                 } else if ((slash = strrchr(name, '/'))) {
577                         int size = slash - name + 1;
578                         memcpy(dirname, name, size);
579                         dirname[size] = 0;
580                         if (slash[1])
581                                 basename = slash + 1;
582                         else
583                                 basename = conf_get_configname();
584                 } else
585                         basename = name;
586         } else
587                 basename = conf_get_configname();
588
589         sprintf(newname, "%s%s", dirname, basename);
590         env = getenv("KCONFIG_OVERWRITECONFIG");
591         if (!env || !*env) {
592                 sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
593                 out = fopen(tmpname, "w");
594         } else {
595                 *tmpname = 0;
596                 out = fopen(newname, "w");
597         }
598         if (!out)
599                 return 1;
600
601         time(&now);
602         env = getenv("KCONFIG_NOTIMESTAMP");
603         if (env && *env)
604                 use_timestamp = 0;
605
606         fprintf(out, _("#\n"
607                        "# Automatically generated make config: don't edit\n"
608                        "# %s\n"
609                        "%s%s"
610                        "#\n"),
611                      rootmenu.prompt->text,
612                      use_timestamp ? "# " : "",
613                      use_timestamp ? ctime(&now) : "");
614
615         if (!conf_get_changed())
616                 sym_clear_all_valid();
617
618         menu = rootmenu.list;
619         while (menu) {
620                 sym = menu->sym;
621                 if (!sym) {
622                         if (!menu_is_visible(menu))
623                                 goto next;
624                         str = menu_get_prompt(menu);
625                         fprintf(out, "\n"
626                                      "#\n"
627                                      "# %s\n"
628                                      "#\n", str);
629                 } else if (!(sym->flags & SYMBOL_CHOICE)) {
630                         sym_calc_value(sym);
631                         if (!(sym->flags & SYMBOL_WRITE))
632                                 goto next;
633                         sym->flags &= ~SYMBOL_WRITE;
634                         /* Write config symbol to file */
635                         conf_write_symbol(sym, out, true);
636                 }
637
638 next:
639                 if (menu->list) {
640                         menu = menu->list;
641                         continue;
642                 }
643                 if (menu->next)
644                         menu = menu->next;
645                 else while ((menu = menu->parent)) {
646                         if (menu->next) {
647                                 menu = menu->next;
648                                 break;
649                         }
650                 }
651         }
652         fclose(out);
653
654         if (*tmpname) {
655                 strcat(dirname, basename);
656                 strcat(dirname, ".old");
657                 rename(newname, dirname);
658                 if (rename(tmpname, newname))
659                         return 1;
660         }
661
662         conf_message(_("configuration written to %s"), newname);
663
664         sym_set_change_count(0);
665
666         return 0;
667 }
668
669 static int conf_split_config(void)
670 {
671         const char *name;
672         char path[PATH_MAX+1];
673         char *s, *d, c;
674         struct symbol *sym;
675         struct stat sb;
676         int res, i, fd;
677
678         name = conf_get_autoconfig_name();
679         conf_read_simple(name, S_DEF_AUTO);
680
681         if (chdir("include/config"))
682                 return 1;
683
684         res = 0;
685         for_all_symbols(i, sym) {
686                 sym_calc_value(sym);
687                 if ((sym->flags & SYMBOL_AUTO) || !sym->name)
688                         continue;
689                 if (sym->flags & SYMBOL_WRITE) {
690                         if (sym->flags & SYMBOL_DEF_AUTO) {
691                                 /*
692                                  * symbol has old and new value,
693                                  * so compare them...
694                                  */
695                                 switch (sym->type) {
696                                 case S_BOOLEAN:
697                                 case S_TRISTATE:
698                                         if (sym_get_tristate_value(sym) ==
699                                             sym->def[S_DEF_AUTO].tri)
700                                                 continue;
701                                         break;
702                                 case S_STRING:
703                                 case S_HEX:
704                                 case S_INT:
705                                         if (!strcmp(sym_get_string_value(sym),
706                                                     sym->def[S_DEF_AUTO].val))
707                                                 continue;
708                                         break;
709                                 default:
710                                         break;
711                                 }
712                         } else {
713                                 /*
714                                  * If there is no old value, only 'no' (unset)
715                                  * is allowed as new value.
716                                  */
717                                 switch (sym->type) {
718                                 case S_BOOLEAN:
719                                 case S_TRISTATE:
720                                         if (sym_get_tristate_value(sym) == no)
721                                                 continue;
722                                         break;
723                                 default:
724                                         break;
725                                 }
726                         }
727                 } else if (!(sym->flags & SYMBOL_DEF_AUTO))
728                         /* There is neither an old nor a new value. */
729                         continue;
730                 /* else
731                  *      There is an old value, but no new value ('no' (unset)
732                  *      isn't saved in auto.conf, so the old value is always
733                  *      different from 'no').
734                  */
735
736                 /* Replace all '_' and append ".h" */
737                 s = sym->name;
738                 d = path;
739                 while ((c = *s++)) {
740                         c = tolower(c);
741                         *d++ = (c == '_') ? '/' : c;
742                 }
743                 strcpy(d, ".h");
744
745                 /* Assume directory path already exists. */
746                 fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
747                 if (fd == -1) {
748                         if (errno != ENOENT) {
749                                 res = 1;
750                                 break;
751                         }
752                         /*
753                          * Create directory components,
754                          * unless they exist already.
755                          */
756                         d = path;
757                         while ((d = strchr(d, '/'))) {
758                                 *d = 0;
759                                 if (stat(path, &sb) && mkdir(path, 0755)) {
760                                         res = 1;
761                                         goto out;
762                                 }
763                                 *d++ = '/';
764                         }
765                         /* Try it again. */
766                         fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
767                         if (fd == -1) {
768                                 res = 1;
769                                 break;
770                         }
771                 }
772                 close(fd);
773         }
774 out:
775         if (chdir("../.."))
776                 return 1;
777
778         return res;
779 }
780
781 int conf_write_autoconf(void)
782 {
783         struct symbol *sym;
784         const char *str;
785         const char *name;
786         FILE *out, *tristate, *out_h;
787         time_t now;
788         int i;
789
790         sym_clear_all_valid();
791
792         file_write_dep("include/config/auto.conf.cmd");
793
794         if (conf_split_config())
795                 return 1;
796
797         out = fopen(".tmpconfig", "w");
798         if (!out)
799                 return 1;
800
801         tristate = fopen(".tmpconfig_tristate", "w");
802         if (!tristate) {
803                 fclose(out);
804                 return 1;
805         }
806
807         out_h = fopen(".tmpconfig.h", "w");
808         if (!out_h) {
809                 fclose(out);
810                 fclose(tristate);
811                 return 1;
812         }
813
814         time(&now);
815         fprintf(out, "#\n"
816                      "# Automatically generated make config: don't edit\n"
817                      "# %s\n"
818                      "# %s"
819                      "#\n",
820                      rootmenu.prompt->text, ctime(&now));
821         fprintf(tristate, "#\n"
822                           "# Automatically generated - do not edit\n"
823                           "\n");
824         fprintf(out_h, "/*\n"
825                        " * Automatically generated C config: don't edit\n"
826                        " * %s\n"
827                        " * %s"
828                        " */\n",
829                        rootmenu.prompt->text, ctime(&now));
830
831         for_all_symbols(i, sym) {
832                 sym_calc_value(sym);
833                 if (!sym->name)
834                         continue;
835                 if (!(sym->flags & SYMBOL_WRITE)) {
836                         if (sym->type == S_BOOLEAN || sym->type == S_HEX
837                             || sym->type == S_INT)
838                                 fprintf(out_h, "#define %s%s 0\n",
839                                         CONFIG_, sym->name);
840                         continue;
841                 }
842
843                 /* write symbol to config file */
844                 conf_write_symbol(sym, out, false);
845
846                 /* update autoconf and tristate files */
847                 switch (sym->type) {
848                 case S_BOOLEAN:
849                 case S_TRISTATE:
850                         switch (sym_get_tristate_value(sym)) {
851                         case no:
852                                 fprintf(out_h, "#define %s%s 0\n",
853                                     CONFIG_, sym->name);
854                                 break;
855                         case mod:
856                                 fprintf(tristate, "%s%s=M\n",
857                                     CONFIG_, sym->name);
858                                 fprintf(out_h, "#define %s%s_MODULE 1\n",
859                                     CONFIG_, sym->name);
860                                 break;
861                         case yes:
862                                 if (sym->type == S_TRISTATE)
863                                         fprintf(tristate,"%s%s=Y\n",
864                                             CONFIG_, sym->name);
865                                 fprintf(out_h, "#define %s%s 1\n",
866                                     CONFIG_, sym->name);
867                                 break;
868                         }
869                         break;
870                 case S_STRING:
871                         conf_write_string(true, sym->name, sym_get_string_value(sym), out_h);
872                         break;
873                 case S_HEX:
874                         str = sym_get_string_value(sym);
875                         if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
876                                 fprintf(out_h, "#define %s%s 0x%s\n",
877                                     CONFIG_, sym->name, str);
878                                 break;
879                         }
880                 case S_INT:
881                         str = sym_get_string_value(sym);
882                         fprintf(out_h, "#define %s%s %s\n",
883                             CONFIG_, sym->name, str);
884                         break;
885                 default:
886                         break;
887                 }
888         }
889         fclose(out);
890         fclose(tristate);
891         fclose(out_h);
892
893         name = getenv("KCONFIG_AUTOHEADER");
894         if (!name)
895                 name = "include/generated/autoconf.h";
896         if (rename(".tmpconfig.h", name))
897                 return 1;
898         name = getenv("KCONFIG_TRISTATE");
899         if (!name)
900                 name = "include/config/tristate.conf";
901         if (rename(".tmpconfig_tristate", name))
902                 return 1;
903         name = conf_get_autoconfig_name();
904         /*
905          * This must be the last step, kbuild has a dependency on auto.conf
906          * and this marks the successful completion of the previous steps.
907          */
908         if (rename(".tmpconfig", name))
909                 return 1;
910
911         return 0;
912 }
913
914 static int sym_change_count;
915 static void (*conf_changed_callback)(void);
916
917 void sym_set_change_count(int count)
918 {
919         int _sym_change_count = sym_change_count;
920         sym_change_count = count;
921         if (conf_changed_callback &&
922             (bool)_sym_change_count != (bool)count)
923                 conf_changed_callback();
924 }
925
926 void sym_add_change_count(int count)
927 {
928         sym_set_change_count(count + sym_change_count);
929 }
930
931 bool conf_get_changed(void)
932 {
933         return sym_change_count;
934 }
935
936 void conf_set_changed_callback(void (*fn)(void))
937 {
938         conf_changed_callback = fn;
939 }
940
941 static void randomize_choice_values(struct symbol *csym)
942 {
943         struct property *prop;
944         struct symbol *sym;
945         struct expr *e;
946         int cnt, def;
947
948         /*
949          * If choice is mod then we may have more items selected
950          * and if no then no-one.
951          * In both cases stop.
952          */
953         if (csym->curr.tri != yes)
954                 return;
955
956         prop = sym_get_choice_prop(csym);
957
958         /* count entries in choice block */
959         cnt = 0;
960         expr_list_for_each_sym(prop->expr, e, sym)
961                 cnt++;
962
963         /*
964          * find a random value and set it to yes,
965          * set the rest to no so we have only one set
966          */
967         def = (rand() % cnt);
968
969         cnt = 0;
970         expr_list_for_each_sym(prop->expr, e, sym) {
971                 if (def == cnt++) {
972                         sym->def[S_DEF_USER].tri = yes;
973                         csym->def[S_DEF_USER].val = sym;
974                 }
975                 else {
976                         sym->def[S_DEF_USER].tri = no;
977                 }
978         }
979         csym->flags |= SYMBOL_DEF_USER;
980         /* clear VALID to get value calculated */
981         csym->flags &= ~(SYMBOL_VALID);
982 }
983
984 static void set_all_choice_values(struct symbol *csym)
985 {
986         struct property *prop;
987         struct symbol *sym;
988         struct expr *e;
989
990         prop = sym_get_choice_prop(csym);
991
992         /*
993          * Set all non-assinged choice values to no
994          */
995         expr_list_for_each_sym(prop->expr, e, sym) {
996                 if (!sym_has_value(sym))
997                         sym->def[S_DEF_USER].tri = no;
998         }
999         csym->flags |= SYMBOL_DEF_USER;
1000         /* clear VALID to get value calculated */
1001         csym->flags &= ~(SYMBOL_VALID);
1002 }
1003
1004 void conf_set_all_new_symbols(enum conf_def_mode mode)
1005 {
1006         struct symbol *sym, *csym;
1007         int i, cnt;
1008
1009         for_all_symbols(i, sym) {
1010                 if (sym_has_value(sym))
1011                         continue;
1012                 switch (sym_get_type(sym)) {
1013                 case S_BOOLEAN:
1014                 case S_TRISTATE:
1015                         switch (mode) {
1016                         case def_yes:
1017                                 sym->def[S_DEF_USER].tri = yes;
1018                                 break;
1019                         case def_mod:
1020                                 sym->def[S_DEF_USER].tri = mod;
1021                                 break;
1022                         case def_no:
1023                                 sym->def[S_DEF_USER].tri = no;
1024                                 break;
1025                         case def_random:
1026                                 cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
1027                                 sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
1028                                 break;
1029                         default:
1030                                 continue;
1031                         }
1032                         if (!(sym_is_choice(sym) && mode == def_random))
1033                                 sym->flags |= SYMBOL_DEF_USER;
1034                         break;
1035                 default:
1036                         break;
1037                 }
1038
1039         }
1040
1041         sym_clear_all_valid();
1042
1043         /*
1044          * We have different type of choice blocks.
1045          * If curr.tri equals to mod then we can select several
1046          * choice symbols in one block.
1047          * In this case we do nothing.
1048          * If curr.tri equals yes then only one symbol can be
1049          * selected in a choice block and we set it to yes,
1050          * and the rest to no.
1051          */
1052         for_all_symbols(i, csym) {
1053                 if (sym_has_value(csym) || !sym_is_choice(csym))
1054                         continue;
1055
1056                 sym_calc_value(csym);
1057                 if (mode == def_random)
1058                         randomize_choice_values(csym);
1059                 else
1060                         set_all_choice_values(csym);
1061         }
1062 }