summaryrefslogtreecommitdiff
path: root/scripts/config/confdata.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2005-09-14 14:40:01 +0000
committerRob Landley <rob@landley.net>2005-09-14 14:40:01 +0000
commit2ee82723a8a90d7aefa445e288b1f3427d75301d (patch)
tree0d421789cdce38007ff3a3064d92abdec8a4882f /scripts/config/confdata.c
parent1e51925684d45b65cc0ed1f3e25a0ef52c82c471 (diff)
downloadbusybox-w32-2ee82723a8a90d7aefa445e288b1f3427d75301d.tar.gz
busybox-w32-2ee82723a8a90d7aefa445e288b1f3427d75301d.tar.bz2
busybox-w32-2ee82723a8a90d7aefa445e288b1f3427d75301d.zip
Our config should write out each symbol once and only once, but still write
out all symbols in all sub-menus. I think this finally does it right.
Diffstat (limited to 'scripts/config/confdata.c')
-rw-r--r--scripts/config/confdata.c67
1 files changed, 39 insertions, 28 deletions
diff --git a/scripts/config/confdata.c b/scripts/config/confdata.c
index 327cf9a4f..5a3de978d 100644
--- a/scripts/config/confdata.c
+++ b/scripts/config/confdata.c
@@ -255,6 +255,21 @@ int conf_read(const char *name)
255 return 0; 255 return 0;
256} 256}
257 257
258struct menu *next_menu(struct menu *menu)
259{
260 if (menu->list) return menu->list;
261 do {
262 if (menu->next) {
263 menu = menu->next;
264 break;
265 }
266 } while ((menu = menu->parent));
267
268 return menu;
269}
270
271#define SYMBOL_FORCEWRITE (1<<31)
272
258int conf_write(const char *name) 273int conf_write(const char *name)
259{ 274{
260 FILE *out, *out_h; 275 FILE *out, *out_h;
@@ -318,27 +333,34 @@ int conf_write(const char *name)
318 if (!sym_change_count) 333 if (!sym_change_count)
319 sym_clear_all_valid(); 334 sym_clear_all_valid();
320 335
336 /* Force write of all non-duplicate symbols. */
337
338 /* Write out everything by default. */
339 for(menu = rootmenu.list; menu; menu = next_menu(menu))
340 if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE;
341
321 menu = rootmenu.list; 342 menu = rootmenu.list;
322 while (menu) { 343 while (menu) {
323 sym = menu->sym; 344 sym = menu->sym;
324 if (!sym) { 345 if (!sym) {
325 if (menu_is_visible(menu)) { 346 if (!menu_is_visible(menu))
326 str = menu_get_prompt(menu); 347 goto next;
327 fprintf(out, "\n" 348 str = menu_get_prompt(menu);
328 "#\n" 349 fprintf(out, "\n"
329 "# %s\n" 350 "#\n"
330 "#\n", str); 351 "# %s\n"
331 if (out_h) 352 "#\n", str);
332 fprintf(out_h, "\n" 353 if (out_h)
333 "/*\n" 354 fprintf(out_h, "\n"
334 " * %s\n" 355 "/*\n"
335 " */\n", str); 356 " * %s\n"
336 } 357 " */\n", str);
337 } else if (!(sym->flags & SYMBOL_CHOICE)) { 358 } else if (!(sym->flags & SYMBOL_CHOICE)) {
338 sym_calc_value(sym); 359 sym_calc_value(sym);
339 //if (!(sym->flags & SYMBOL_WRITE)) 360 if (!(sym->flags & SYMBOL_FORCEWRITE))
340 // goto next; 361 goto next;
341 sym->flags &= ~SYMBOL_WRITE; 362
363 sym->flags &= ~SYMBOL_FORCEWRITE;
342 type = sym->type; 364 type = sym->type;
343 if (type == S_TRISTATE) { 365 if (type == S_TRISTATE) {
344 sym_calc_value(modules_sym); 366 sym_calc_value(modules_sym);
@@ -409,19 +431,8 @@ int conf_write(const char *name)
409 break; 431 break;
410 } 432 }
411 } 433 }
412 434next:
413 if (menu->list) { 435 menu = next_menu(menu);
414 menu = menu->list;
415 continue;
416 }
417 if (menu->next)
418 menu = menu->next;
419 else while ((menu = menu->parent)) {
420 if (menu->next) {
421 menu = menu->next;
422 break;
423 }
424 }
425 } 436 }
426 fclose(out); 437 fclose(out);
427 if (out_h) { 438 if (out_h) {