diff options
author | Leo C | 2014-09-02 21:41:46 +0200 |
---|---|---|
committer | Leo C | 2014-09-02 21:41:46 +0200 |
commit | 04cffff06efa61b5300105d0db98c0f4fbfa8d47 (patch) | |
tree | 8c63c010e5bba1de8227552fca4e0dbcd752eda6 /avr/env.c | |
parent | 507d25e2cdac7489ca8706f6582e271fd1689816 (diff) | |
download | z180-stamp-04cffff06efa61b5300105d0db98c0f4fbfa8d47.zip |
envlist_search: eliminate temp buffer
Diffstat (limited to 'avr/env.c')
-rw-r--r-- | avr/env.c | 41 |
1 files changed, 22 insertions, 19 deletions
@@ -74,35 +74,43 @@ char env_get_char(uint16_t index) } +static const FLASH char *comp_key; + static int comp_env_items(const void *m1, const void *m2) { env_item_t *ep1 = (env_item_t *) m1; env_item_t *ep2 = (env_item_t *) m2; - return strcmp(ep1->envvar, ep2->envvar); + if (ep1 == NULL) + return - strcmp_P(ep2->envvar, comp_key); + else + return strcmp(ep1->envvar, ep2->envvar); } env_item_t *envlist_search(const MEMX char *name) { - env_item_t e; - - e.envvar = (char *) name; - #ifdef __MEMX - char buf[CONFIG_SYS_ENV_NAMELEN+1]; - if (__builtin_avr_flash_segment(name) != -1) { - char *p = buf; - while ((*p++ = *name++) != '\0') - ; - e.envvar = buf; + comp_key = name; + return bsearch(0, env_list, entrycount, + sizeof(env_item_t), comp_env_items); + } else { + + env_item_t e; + e.envvar = (char *) name; + + return bsearch(&e, env_list, entrycount, + sizeof(env_item_t), comp_env_items); } -#endif /* __MEMX */ +#else + env_item_t e; + e.envvar = (char *) name; return bsearch(&e, env_list, entrycount, sizeof(env_item_t), comp_env_items); +#endif /* __MEMX */ } @@ -148,14 +156,9 @@ int env_item_delete(env_item_t *ep) } static -int envlist_delete(const char *name) +int envlist_delete(const MEMX char *name) { - env_item_t e; - - e.envvar = (char *) name; - - env_item_t *ep = bsearch(&e, env_list, entrycount, - sizeof(env_item_t), comp_env_items); + env_item_t *ep = envlist_search(name); if (ep != NULL) return env_item_delete(ep); |