mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 00:28:52 +02:00 
			
		
		
		
	kconfig: add a function to dump all menu entries in a tree-like format
This is useful for debugging purposes. menu_finalize() re-parents menu entries, and this function can be used to dump the final structure of the menu tree. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
		
							parent
							
								
									65056488e8
								
							
						
					
					
						commit
						263e70bc42
					
				
					 2 changed files with 75 additions and 0 deletions
				
			
		|  | @ -102,6 +102,7 @@ struct menu *menu_get_menu_or_parent_menu(struct menu *menu); | |||
| int get_jump_key_char(void); | ||||
| struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head); | ||||
| void menu_get_ext_help(struct menu *menu, struct gstr *help); | ||||
| void menu_dump(void); | ||||
| 
 | ||||
| /* symbol.c */ | ||||
| void sym_clear_all_valid(void); | ||||
|  |  | |||
|  | @ -788,3 +788,77 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help) | |||
| 	if (sym) | ||||
| 		get_symbol_str(help, sym, NULL); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * menu_dump - dump all menu entries in a tree-like format | ||||
|  */ | ||||
| void menu_dump(void) | ||||
| { | ||||
| 	struct menu *menu = &rootmenu; | ||||
| 	unsigned long long bits = 0; | ||||
| 	int indent = 0; | ||||
| 
 | ||||
| 	while (menu) { | ||||
| 
 | ||||
| 		for (int i = indent - 1; i >= 0; i--) { | ||||
| 			if (bits & (1ULL << i)) { | ||||
| 				if (i > 0) | ||||
| 					printf("|   "); | ||||
| 				else | ||||
| 					printf("|-- "); | ||||
| 			} else { | ||||
| 				if (i > 0) | ||||
| 					printf("    "); | ||||
| 				else | ||||
| 					printf("`-- "); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		switch (menu->type) { | ||||
| 		case M_CHOICE: | ||||
| 			printf("choice \"%s\"\n", menu->prompt->text); | ||||
| 			break; | ||||
| 		case M_COMMENT: | ||||
| 			printf("comment \"%s\"\n", menu->prompt->text); | ||||
| 			break; | ||||
| 		case M_IF: | ||||
| 			printf("if\n"); | ||||
| 			break; | ||||
| 		case M_MENU: | ||||
| 			printf("menu \"%s\"", menu->prompt->text); | ||||
| 			if (!menu->sym) { | ||||
| 				printf("\n"); | ||||
| 				break; | ||||
| 			} | ||||
| 			printf(" + "); | ||||
| 			/* fallthrough */ | ||||
| 		case M_NORMAL: | ||||
| 			printf("symbol %s\n", menu->sym->name); | ||||
| 			break; | ||||
| 		} | ||||
| 		if (menu->list) { | ||||
| 			bits <<= 1; | ||||
| 			menu = menu->list; | ||||
| 			if (menu->next) | ||||
| 				bits |= 1; | ||||
| 			else | ||||
| 				bits &= ~1; | ||||
| 			indent++; | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		while (menu && !menu->next) { | ||||
| 			menu = menu->parent; | ||||
| 			bits >>= 1; | ||||
| 			indent--; | ||||
| 		} | ||||
| 
 | ||||
| 		if (menu) { | ||||
| 			menu = menu->next; | ||||
| 			if (menu->next) | ||||
| 				bits |= 1; | ||||
| 			else | ||||
| 				bits &= ~1; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Masahiro Yamada
						Masahiro Yamada