pmic: Enable power_board_init() support at TRATS
[platform/kernel/u-boot.git] / lib / hashtable.c
index f3f47de..94a7b61 100644 (file)
@@ -435,6 +435,7 @@ int hdelete_r(const char *key, struct hsearch_data *htab, int do_apply)
  * hexport()
  */
 
+#ifndef CONFIG_SPL_BUILD
 /*
  * Export the data stored in the hash table in linearized form.
  *
@@ -601,28 +602,39 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep,
 
        return size;
 }
+#endif
 
 
 /*
  * himport()
  */
 
-/* Check whether variable name is amongst vars[] */
-static int is_var_in_set(const char *name, int nvars, char * const vars[])
+/*
+ * Check whether variable 'name' is amongst vars[],
+ * and remove all instances by setting the pointer to NULL
+ */
+static int drop_var_from_set(const char *name, int nvars, char * vars[])
 {
        int i = 0;
+       int res = 0;
 
        /* No variables specified means process all of them */
        if (nvars == 0)
                return 1;
 
        for (i = 0; i < nvars; i++) {
-               if (!strcmp(name, vars[i]))
-                       return 1;
+               if (vars[i] == NULL)
+                       continue;
+               /* If we found it, delete all of them */
+               if (!strcmp(name, vars[i])) {
+                       vars[i] = NULL;
+                       res = 1;
+               }
        }
-       debug("Skipping non-listed variable %s\n", name);
+       if (!res)
+               debug("Skipping non-listed variable %s\n", name);
 
-       return 0;
+       return res;
 }
 
 /*
@@ -665,6 +677,8 @@ int himport_r(struct hsearch_data *htab,
                int nvars, char * const vars[], int do_apply)
 {
        char *data, *sp, *dp, *name, *value;
+       char *localvars[nvars];
+       int i;
 
        /* Test for correct arguments.  */
        if (htab == NULL) {
@@ -681,6 +695,10 @@ int himport_r(struct hsearch_data *htab,
        memcpy(data, env, size);
        dp = data;
 
+       /* make a local copy of the list of variables */
+       if (nvars)
+               memcpy(localvars, vars, sizeof(vars[0]) * nvars);
+
        if ((flag & H_NOCLEAR) == 0) {
                /* Destroy old hash table if one exists */
                debug("Destroy Hash Table: %p table = %p\n", htab,
@@ -749,7 +767,7 @@ int himport_r(struct hsearch_data *htab,
                        *dp++ = '\0';   /* terminate name */
 
                        debug("DELETE CANDIDATE: \"%s\"\n", name);
-                       if (!is_var_in_set(name, nvars, vars))
+                       if (!drop_var_from_set(name, nvars, localvars))
                                continue;
 
                        if (hdelete_r(name, htab, do_apply) == 0)
@@ -769,7 +787,7 @@ int himport_r(struct hsearch_data *htab,
                ++dp;
 
                /* Skip variables which are not supposed to be processed */
-               if (!is_var_in_set(name, nvars, vars))
+               if (!drop_var_from_set(name, nvars, localvars))
                        continue;
 
                /* enter into hash table */
@@ -809,6 +827,24 @@ int himport_r(struct hsearch_data *htab,
        debug("INSERT: free(data = %p)\n", data);
        free(data);
 
+       /* process variables which were not considered */
+       for (i = 0; i < nvars; i++) {
+               if (localvars[i] == NULL)
+                       continue;
+               /*
+                * All variables which were not deleted from the variable list
+                * were not present in the imported env
+                * This could mean two things:
+                * a) if the variable was present in current env, we delete it
+                * b) if the variable was not present in current env, we notify
+                *    it might be a typo
+                */
+               if (hdelete_r(localvars[i], htab, do_apply) == 0)
+                       printf("WARNING: '%s' neither in running nor in imported env!\n", localvars[i]);
+               else
+                       printf("WARNING: '%s' not in imported env, deleting it!\n", localvars[i]);
+       }
+
        debug("INSERT: done\n");
        return 1;               /* everything OK */
 }