mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	menuconfig: Replace CIRCLEQ by list_head-style lists.
sys/queue.h and CIRCLEQ in particular have proven to cause portability problems (reported on Debian Sarge, Cygwin and FreeBSD) Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Tested-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Tested-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net> Signed-off-by: Benjamin Poirier <bpoirier@suse.de> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Signed-off-by: Michal Marek <mmarek@suse.cz>
This commit is contained in:
		
							parent
							
								
									ddffeb8c4d
								
							
						
					
					
						commit
						bad9955db1
					
				
					 5 changed files with 106 additions and 14 deletions
				
			
		|  | @ -12,7 +12,7 @@ extern "C" { | |||
| 
 | ||||
| #include <assert.h> | ||||
| #include <stdio.h> | ||||
| #include <sys/queue.h> | ||||
| #include "list.h" | ||||
| #ifndef __cplusplus | ||||
| #include <stdbool.h> | ||||
| #endif | ||||
|  | @ -175,12 +175,11 @@ struct menu { | |||
| #define MENU_ROOT		0x0002 | ||||
| 
 | ||||
| struct jump_key { | ||||
| 	CIRCLEQ_ENTRY(jump_key) entries; | ||||
| 	struct list_head entries; | ||||
| 	size_t offset; | ||||
| 	struct menu *target; | ||||
| 	int index; | ||||
| }; | ||||
| CIRCLEQ_HEAD(jk_head, jump_key); | ||||
| 
 | ||||
| #define JUMP_NB			9 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										91
									
								
								scripts/kconfig/list.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								scripts/kconfig/list.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,91 @@ | |||
| #ifndef LIST_H | ||||
| #define LIST_H | ||||
| 
 | ||||
| /*
 | ||||
|  * Copied from include/linux/... | ||||
|  */ | ||||
| 
 | ||||
| #undef offsetof | ||||
| #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) | ||||
| 
 | ||||
| /**
 | ||||
|  * container_of - cast a member of a structure out to the containing structure | ||||
|  * @ptr:        the pointer to the member. | ||||
|  * @type:       the type of the container struct this is embedded in. | ||||
|  * @member:     the name of the member within the struct. | ||||
|  * | ||||
|  */ | ||||
| #define container_of(ptr, type, member) ({                      \ | ||||
| 	const typeof( ((type *)0)->member ) *__mptr = (ptr);    \ | ||||
| 	(type *)( (char *)__mptr - offsetof(type,member) );}) | ||||
| 
 | ||||
| 
 | ||||
| struct list_head { | ||||
| 	struct list_head *next, *prev; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| #define LIST_HEAD_INIT(name) { &(name), &(name) } | ||||
| 
 | ||||
| #define LIST_HEAD(name) \ | ||||
| 	struct list_head name = LIST_HEAD_INIT(name) | ||||
| 
 | ||||
| /**
 | ||||
|  * list_entry - get the struct for this entry | ||||
|  * @ptr:	the &struct list_head pointer. | ||||
|  * @type:	the type of the struct this is embedded in. | ||||
|  * @member:	the name of the list_struct within the struct. | ||||
|  */ | ||||
| #define list_entry(ptr, type, member) \ | ||||
| 	container_of(ptr, type, member) | ||||
| 
 | ||||
| /**
 | ||||
|  * list_for_each_entry	-	iterate over list of given type | ||||
|  * @pos:	the type * to use as a loop cursor. | ||||
|  * @head:	the head for your list. | ||||
|  * @member:	the name of the list_struct within the struct. | ||||
|  */ | ||||
| #define list_for_each_entry(pos, head, member)				\ | ||||
| 	for (pos = list_entry((head)->next, typeof(*pos), member);	\ | ||||
| 	     &pos->member != (head); 	\ | ||||
| 	     pos = list_entry(pos->member.next, typeof(*pos), member)) | ||||
| 
 | ||||
| /**
 | ||||
|  * list_empty - tests whether a list is empty | ||||
|  * @head: the list to test. | ||||
|  */ | ||||
| static inline int list_empty(const struct list_head *head) | ||||
| { | ||||
| 	return head->next == head; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Insert a new entry between two known consecutive entries. | ||||
|  * | ||||
|  * This is only for internal list manipulation where we know | ||||
|  * the prev/next entries already! | ||||
|  */ | ||||
| static inline void __list_add(struct list_head *_new, | ||||
| 			      struct list_head *prev, | ||||
| 			      struct list_head *next) | ||||
| { | ||||
| 	next->prev = _new; | ||||
| 	_new->next = next; | ||||
| 	_new->prev = prev; | ||||
| 	prev->next = _new; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * list_add_tail - add a new entry | ||||
|  * @new: new entry to be added | ||||
|  * @head: list head to add it before | ||||
|  * | ||||
|  * Insert a new entry before the specified head. | ||||
|  * This is useful for implementing queues. | ||||
|  */ | ||||
| static inline void list_add_tail(struct list_head *_new, struct list_head *head) | ||||
| { | ||||
| 	__list_add(_new, head->prev, head); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | @ -21,9 +21,9 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu)); | |||
| P(menu_get_parent_menu,struct menu *,(struct menu *menu)); | ||||
| P(menu_has_help,bool,(struct menu *menu)); | ||||
| P(menu_get_help,const char *,(struct menu *menu)); | ||||
| P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct jk_head | ||||
| P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct list_head | ||||
| 			 *head)); | ||||
| P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct jk_head | ||||
| P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct list_head | ||||
| 				   *head)); | ||||
| P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -312,7 +312,7 @@ static void set_config_filename(const char *config_filename) | |||
| 
 | ||||
| 
 | ||||
| struct search_data { | ||||
| 	struct jk_head *head; | ||||
| 	struct list_head *head; | ||||
| 	struct menu **targets; | ||||
| 	int *keys; | ||||
| }; | ||||
|  | @ -323,7 +323,7 @@ static void update_text(char *buf, size_t start, size_t end, void *_data) | |||
| 	struct jump_key *pos; | ||||
| 	int k = 0; | ||||
| 
 | ||||
| 	CIRCLEQ_FOREACH(pos, data->head, entries) { | ||||
| 	list_for_each_entry(pos, data->head, entries) { | ||||
| 		if (pos->offset >= start && pos->offset < end) { | ||||
| 			char header[4]; | ||||
| 
 | ||||
|  | @ -375,7 +375,7 @@ again: | |||
| 
 | ||||
| 	sym_arr = sym_re_search(dialog_input); | ||||
| 	do { | ||||
| 		struct jk_head head = CIRCLEQ_HEAD_INITIALIZER(head); | ||||
| 		LIST_HEAD(head); | ||||
| 		struct menu *targets[JUMP_NB]; | ||||
| 		int keys[JUMP_NB + 1], i; | ||||
| 		struct search_data data = { | ||||
|  |  | |||
|  | @ -508,7 +508,7 @@ const char *menu_get_help(struct menu *menu) | |||
| } | ||||
| 
 | ||||
| static void get_prompt_str(struct gstr *r, struct property *prop, | ||||
| 			   struct jk_head *head) | ||||
| 			   struct list_head *head) | ||||
| { | ||||
| 	int i, j; | ||||
| 	struct menu *submenu[8], *menu, *location = NULL; | ||||
|  | @ -544,12 +544,13 @@ static void get_prompt_str(struct gstr *r, struct property *prop, | |||
| 		} else | ||||
| 			jump->target = location; | ||||
| 
 | ||||
| 		if (CIRCLEQ_EMPTY(head)) | ||||
| 		if (list_empty(head)) | ||||
| 			jump->index = 0; | ||||
| 		else | ||||
| 			jump->index = CIRCLEQ_LAST(head)->index + 1; | ||||
| 			jump->index = list_entry(head->prev, struct jump_key, | ||||
| 						 entries)->index + 1; | ||||
| 
 | ||||
| 		CIRCLEQ_INSERT_TAIL(head, jump, entries); | ||||
| 		list_add_tail(&jump->entries, head); | ||||
| 	} | ||||
| 
 | ||||
| 	if (i > 0) { | ||||
|  | @ -573,7 +574,8 @@ static void get_prompt_str(struct gstr *r, struct property *prop, | |||
| /*
 | ||||
|  * head is optional and may be NULL | ||||
|  */ | ||||
| void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) | ||||
| void get_symbol_str(struct gstr *r, struct symbol *sym, | ||||
| 		    struct list_head *head) | ||||
| { | ||||
| 	bool hit; | ||||
| 	struct property *prop; | ||||
|  | @ -612,7 +614,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) | |||
| 	str_append(r, "\n\n"); | ||||
| } | ||||
| 
 | ||||
| struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head) | ||||
| struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head) | ||||
| { | ||||
| 	struct symbol *sym; | ||||
| 	struct gstr res = str_new(); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Benjamin Poirier
						Benjamin Poirier