-env_item_t *envlist_search(const __memx char *name)
-{
- char *p = (char *) name;
-
-#ifdef __MEMX
- char buf[CONFIG_SYS_ENV_NAMELEN+1];
-
- if (__builtin_avr_flash_segment(name) != -1) {
- p = buf;
- while ((*p++ = *name++) != '\0')
- ;
- p = buf;
- }
-#endif /* __MEMX */
-
- return bsearch(p, env_list, entrycount,
- sizeof(env_item_t), comp_env_key_item);
-}
-
-
-static
-env_item_t *envlist_enter(env_item_t *e)
-{
- char *key = e->name.ram;
- const size_t size = sizeof(env_item_t);
- env_item_t *ep;
-
- ep = bsearch(key, env_list, entrycount,
- size, comp_env_key_item);
-
- if (ep == NULL) {
- if (entrycount < CONFIG_ENVVAR_MAX) {
-
- env_list[entrycount++] = *e;
- qsort(env_list, entrycount, size, comp_env_items);
- ep = bsearch(key, env_list, entrycount,
- size, comp_env_key_item);
- }
- } else {
- if ((ep->flags & EF_V_EEP) == 0) {
- free(ep->val.ram);
- }
- ep->val.ram = e->val.ram;
- }
-
- if (ep != NULL) {
- ep->flags |= EF_DIRTY;
- ep->flags &= ~EF_V_EEP;
-
- if ((ep->flags & EF_N_EEP) == 0) {
- int nlen = strnlen(key, CONFIG_SYS_ENV_NAMELEN);
- char *name = xmalloc(nlen + 1);
- if (name == NULL) {
- printf_P(PSTR("## Can't malloc %d bytes\n"),
- nlen + 1);
- return NULL;
- }
- strcpy(name, key);
- name[nlen] = '\0';
- ep->name.ram = name;
- }
- }
-
- return ep;
-}
-
-
-static
-int env_item_delete(env_item_t *ep)
-{
- if (entrycount == 0)
- return -1;
- if ((ep->flags & EF_V_EEP) == 0)
- free(ep->val.ram);
- if ((ep->flags & EF_N_EEP) == 0)
- free(ep->name.ram);
-
- entrycount--;
- size_t size = sizeof(env_item_t);
- memmove(ep, ep + 1, (env_list - ep)*size + entrycount*size);
-
- return 0;
-}
-
-static
-int envlist_delete(const char *name)
-{
- env_item_t *ep = bsearch(name, env_list, entrycount,
- sizeof(env_item_t), comp_env_key_item);
-
- if (ep != NULL)
- return env_item_delete(ep);
-
- return 1;
-}
-
-
-static
-env_item_t *envlist_get(const __memx char *name, uint_fast8_t flag)
-{
- env_item_t *ep;
-
- ep = envlist_search(name);
-
- if (ep != NULL && (flag & ENV_GET_VAL)) {
- if (ep->flags & EF_V_EEP) {
- char *vp;
- int len;
- len = varval_getlen(ep->val.eep);
- if (len > CONFIG_SYS_CBSIZE)
- len = CONFIG_SYS_CBSIZE;
- vp = xmalloc(len + 1);
- if (vp) {
- varval_get(vp, ep->val.eep, len + 1);
- ep->val.ram = vp;
- ep->flags &= ~EF_V_EEP;
- } else
- printf_P(PSTR("Out of memory!\n"));
- }
- }
-
- return ep;