mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-27 23:20:26 +09:00
env: Consolidate common code in hsearch_r()
The same chunk of code was replicated in two places and the following changes will make that chunk grow a bit, so combine into a static func. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
c4e0057fa7
commit
3d3b52f258
@ -247,6 +247,34 @@ int hmatch_r(const char *match, int last_idx, ENTRY ** retval,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare an existing entry with the desired key, and overwrite if the action
|
||||
* is ENTER. This is simply a helper function for hsearch_r().
|
||||
*/
|
||||
static inline int _compare_and_overwrite_entry(ENTRY item, ACTION action,
|
||||
ENTRY **retval, struct hsearch_data *htab, int flag,
|
||||
unsigned int hval, unsigned int idx)
|
||||
{
|
||||
if (htab->table[idx].used == hval
|
||||
&& strcmp(item.key, htab->table[idx].entry.key) == 0) {
|
||||
/* Overwrite existing value? */
|
||||
if ((action == ENTER) && (item.data != NULL)) {
|
||||
free(htab->table[idx].entry.data);
|
||||
htab->table[idx].entry.data = strdup(item.data);
|
||||
if (!htab->table[idx].entry.data) {
|
||||
__set_errno(ENOMEM);
|
||||
*retval = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* return found entry */
|
||||
*retval = &htab->table[idx].entry;
|
||||
return idx;
|
||||
}
|
||||
/* keep searching */
|
||||
return -1;
|
||||
}
|
||||
|
||||
int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
|
||||
struct hsearch_data *htab, int flag)
|
||||
{
|
||||
@ -255,6 +283,7 @@ int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
|
||||
unsigned int len = strlen(item.key);
|
||||
unsigned int idx;
|
||||
unsigned int first_deleted = 0;
|
||||
int ret;
|
||||
|
||||
/* Compute an value for the given string. Perhaps use a better method. */
|
||||
hval = len;
|
||||
@ -286,23 +315,10 @@ int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
|
||||
&& !first_deleted)
|
||||
first_deleted = idx;
|
||||
|
||||
if (htab->table[idx].used == hval
|
||||
&& strcmp(item.key, htab->table[idx].entry.key) == 0) {
|
||||
/* Overwrite existing value? */
|
||||
if ((action == ENTER) && (item.data != NULL)) {
|
||||
free(htab->table[idx].entry.data);
|
||||
htab->table[idx].entry.data =
|
||||
strdup(item.data);
|
||||
if (!htab->table[idx].entry.data) {
|
||||
__set_errno(ENOMEM);
|
||||
*retval = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* return found entry */
|
||||
*retval = &htab->table[idx].entry;
|
||||
return idx;
|
||||
}
|
||||
ret = _compare_and_overwrite_entry(item, action, retval, htab,
|
||||
flag, hval, idx);
|
||||
if (ret != -1)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Second hash function:
|
||||
@ -328,23 +344,10 @@ int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
|
||||
break;
|
||||
|
||||
/* If entry is found use it. */
|
||||
if ((htab->table[idx].used == hval)
|
||||
&& strcmp(item.key, htab->table[idx].entry.key) == 0) {
|
||||
/* Overwrite existing value? */
|
||||
if ((action == ENTER) && (item.data != NULL)) {
|
||||
free(htab->table[idx].entry.data);
|
||||
htab->table[idx].entry.data =
|
||||
strdup(item.data);
|
||||
if (!htab->table[idx].entry.data) {
|
||||
__set_errno(ENOMEM);
|
||||
*retval = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* return found entry */
|
||||
*retval = &htab->table[idx].entry;
|
||||
return idx;
|
||||
}
|
||||
ret = _compare_and_overwrite_entry(item, action, retval,
|
||||
htab, flag, hval, idx);
|
||||
if (ret != -1)
|
||||
return ret;
|
||||
}
|
||||
while (htab->table[idx].used);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user