]> cloudbase.mooo.com Git - z180-stamp.git/commitdiff
envlist_search: eliminate temp buffer
authorLeo C <erbl259-lmu@yahoo.de>
Tue, 2 Sep 2014 19:41:46 +0000 (21:41 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Tue, 2 Sep 2014 19:41:46 +0000 (21:41 +0200)
avr/env.c

index 5d1c5c061793d41d67571ee508de30c902daf9ff..017053c24817a8af3de7c4d0d13361bc8de74a8b 100644 (file)
--- 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);