"env grep" - reimplement command using hexport_r()
Also drop hstrstr_r() which is not needed any more. The new code is way more flexible. Signed-off-by: Wolfgang Denk <wd@denx.de>
This commit is contained in:
		
							parent
							
								
									ea009d4743
								
							
						
					
					
						commit
						5a31ea04c9
					
				|  | @ -164,31 +164,25 @@ static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, | ||||||
| static int do_env_grep(cmd_tbl_t *cmdtp, int flag, | static int do_env_grep(cmd_tbl_t *cmdtp, int flag, | ||||||
| 		       int argc, char * const argv[]) | 		       int argc, char * const argv[]) | ||||||
| { | { | ||||||
| 	ENTRY *match; | 	char *res = NULL; | ||||||
| 	unsigned char matched[env_htab.size / 8]; | 	int len; | ||||||
| 	int rcode = 1, arg = 1, idx; |  | ||||||
| 
 | 
 | ||||||
| 	if (argc < 2) | 	if (argc < 2) | ||||||
| 		return CMD_RET_USAGE; | 		return CMD_RET_USAGE; | ||||||
| 
 | 
 | ||||||
| 	memset(matched, 0, env_htab.size / 8); | 	len = hexport_r(&env_htab, '\n', | ||||||
|  | 			flag | H_MATCH_BOTH | H_MATCH_SUBSTR, | ||||||
|  | 			&res, 0, argc, argv); | ||||||
| 
 | 
 | ||||||
| 	while (arg <= argc) { | 	if (len > 0) { | ||||||
| 		idx = 0; | 		puts(res); | ||||||
| 		while ((idx = hstrstr_r(argv[arg], idx, &match, &env_htab))) { | 		free(res); | ||||||
| 			if (!(matched[idx / 8] & (1 << (idx & 7)))) { |  | ||||||
| 				puts(match->key); |  | ||||||
| 				puts("="); |  | ||||||
| 				puts(match->data); |  | ||||||
| 				puts("\n"); |  | ||||||
| 			} |  | ||||||
| 			matched[idx / 8] |= 1 << (idx & 7); |  | ||||||
| 			rcode = 0; |  | ||||||
| 		} |  | ||||||
| 		arg++; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return rcode; | 	if (len < 2) | ||||||
|  | 		return 1; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| #endif /* CONFIG_SPL_BUILD */ | #endif /* CONFIG_SPL_BUILD */ | ||||||
|  |  | ||||||
|  | @ -98,12 +98,6 @@ extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval, | ||||||
|  */ |  */ | ||||||
| extern int hmatch_r(const char *__match, int __last_idx, ENTRY ** __retval, | extern int hmatch_r(const char *__match, int __last_idx, ENTRY ** __retval, | ||||||
| 		    struct hsearch_data *__htab); | 		    struct hsearch_data *__htab); | ||||||
| /*
 |  | ||||||
|  * Search for an entry whose key or data contains `MATCH'.  Otherwise, |  | ||||||
|  * Same semantics as hsearch_r(). |  | ||||||
|  */ |  | ||||||
| extern int hstrstr_r(const char *__match, int __last_idx, ENTRY ** __retval, |  | ||||||
| 		    struct hsearch_data *__htab); |  | ||||||
| 
 | 
 | ||||||
| /* Search and delete entry matching ITEM.key in internal hash table. */ | /* Search and delete entry matching ITEM.key in internal hash table. */ | ||||||
| extern int hdelete_r(const char *__key, struct hsearch_data *__htab, | extern int hdelete_r(const char *__key, struct hsearch_data *__htab, | ||||||
|  |  | ||||||
|  | @ -210,29 +210,6 @@ void hdestroy_r(struct hsearch_data *htab) | ||||||
|  *   example for functions like hdelete(). |  *   example for functions like hdelete(). | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /*
 |  | ||||||
|  * hstrstr_r - return index to entry whose key and/or data contains match |  | ||||||
|  */ |  | ||||||
| int hstrstr_r(const char *match, int last_idx, ENTRY ** retval, |  | ||||||
| 	      struct hsearch_data *htab) |  | ||||||
| { |  | ||||||
| 	unsigned int idx; |  | ||||||
| 
 |  | ||||||
| 	for (idx = last_idx + 1; idx < htab->size; ++idx) { |  | ||||||
| 		if (htab->table[idx].used <= 0) |  | ||||||
| 			continue; |  | ||||||
| 		if (strstr(htab->table[idx].entry.key, match) || |  | ||||||
| 		    strstr(htab->table[idx].entry.data, match)) { |  | ||||||
| 			*retval = &htab->table[idx].entry; |  | ||||||
| 			return idx; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	__set_errno(ESRCH); |  | ||||||
| 	*retval = NULL; |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int hmatch_r(const char *match, int last_idx, ENTRY ** retval, | int hmatch_r(const char *match, int last_idx, ENTRY ** retval, | ||||||
| 	     struct hsearch_data *htab) | 	     struct hsearch_data *htab) | ||||||
| { | { | ||||||
|  | @ -563,23 +540,38 @@ static int cmpkey(const void *p1, const void *p2) | ||||||
| 	return (strcmp(e1->key, e2->key)); | 	return (strcmp(e1->key, e2->key)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int match_strings(ENTRY *ep, int flag, | static int match_string(int flag, const char *str, const char *pat) | ||||||
|  | { | ||||||
|  | 	switch (flag & H_MATCH_METHOD) { | ||||||
|  | 	case H_MATCH_IDENT: | ||||||
|  | 		if (strcmp(str, pat) == 0) | ||||||
|  | 			return 1; | ||||||
|  | 		break; | ||||||
|  | 	case H_MATCH_SUBSTR: | ||||||
|  | 		if (strstr(str, pat)) | ||||||
|  | 			return 1; | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		printf("## ERROR: unsupported match method: 0x%02x\n", | ||||||
|  | 			flag & H_MATCH_METHOD); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int match_entry(ENTRY *ep, int flag, | ||||||
| 		 int argc, char * const argv[]) | 		 int argc, char * const argv[]) | ||||||
| { | { | ||||||
| 	int arg; | 	int arg; | ||||||
| 
 | 
 | ||||||
| 	for (arg = 0; arg < argc; ++arg) { | 	for (arg = 1; arg < argc; ++arg) { | ||||||
| 		if (flag & H_MATCH_KEY) { | 		if (flag & H_MATCH_KEY) { | ||||||
| 			switch (flag & H_MATCH_METHOD) { | 			if (match_string(flag, ep->key, argv[arg])) | ||||||
| 			case H_MATCH_IDENT: | 				return 1; | ||||||
| 				if (strcmp(argv[arg], ep->key) == 0) | 		} | ||||||
| 					return 1; | 		if (flag & H_MATCH_DATA) { | ||||||
| 				break; | 			if (match_string(flag, ep->data, argv[arg])) | ||||||
| 			default: | 				return 1; | ||||||
| 				printf("## ERROR: unsupported match method: 0x%02x\n", |  | ||||||
| 					flag & H_MATCH_METHOD); |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return 0; | 	return 0; | ||||||
|  | @ -611,7 +603,7 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep, int flag, | ||||||
| 
 | 
 | ||||||
| 		if (htab->table[i].used > 0) { | 		if (htab->table[i].used > 0) { | ||||||
| 			ENTRY *ep = &htab->table[i].entry; | 			ENTRY *ep = &htab->table[i].entry; | ||||||
| 			int found = match_strings(ep, flag, argc, argv); | 			int found = match_entry(ep, flag, argc, argv); | ||||||
| 
 | 
 | ||||||
| 			if ((argc > 0) && (found == 0)) | 			if ((argc > 0) && (found == 0)) | ||||||
| 				continue; | 				continue; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue