summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo C2014-09-02 21:41:46 +0200
committerLeo C2014-09-02 21:41:46 +0200
commit04cffff06efa61b5300105d0db98c0f4fbfa8d47 (patch)
tree8c63c010e5bba1de8227552fca4e0dbcd752eda6
parent507d25e2cdac7489ca8706f6582e271fd1689816 (diff)
downloadz180-stamp-04cffff06efa61b5300105d0db98c0f4fbfa8d47.zip
envlist_search: eliminate temp buffer
-rw-r--r--avr/env.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/avr/env.c b/avr/env.c
index 5d1c5c0..017053c 100644
--- a/avr/env.c
+++ b/avr/env.c
@@ -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);