]> git.sur5r.net Git - u-boot/blobdiff - lib/hashtable.c
Various, unrelated tree-wide typo fixes.
[u-boot] / lib / hashtable.c
index 644330a17e8ce7a6bdb8f0112094d5c1e884435e..435e2a6ac14591158da3bf9fe50dd4f1c1382695 100644 (file)
@@ -564,7 +564,7 @@ static int match_entry(ENTRY *ep, int flag,
        int arg;
        void *priv = NULL;
 
-       for (arg = 1; arg < argc; ++arg) {
+       for (arg = 0; arg < argc; ++arg) {
 #ifdef CONFIG_REGEX
                struct slre slre;
 
@@ -776,7 +776,7 @@ static int drop_var_from_set(const char *name, int nvars, char * vars[])
 
 int himport_r(struct hsearch_data *htab,
                const char *env, size_t size, const char sep, int flag,
-               int nvars, char * const vars[])
+               int crlf_is_lf, int nvars, char * const vars[])
 {
        char *data, *sp, *dp, *name, *value;
        char *localvars[nvars];
@@ -789,12 +789,13 @@ int himport_r(struct hsearch_data *htab,
        }
 
        /* we allocate new space to make sure we can write to the array */
-       if ((data = malloc(size)) == NULL) {
-               debug("himport_r: can't malloc %zu bytes\n", size);
+       if ((data = malloc(size + 1)) == NULL) {
+               debug("himport_r: can't malloc %zu bytes\n", size + 1);
                __set_errno(ENOMEM);
                return 0;
        }
        memcpy(data, env, size);
+       data[size] = '\0';
        dp = data;
 
        /* make a local copy of the list of variables */
@@ -817,11 +818,11 @@ int himport_r(struct hsearch_data *htab,
         * size of 8 per entry (= safety factor of ~5) should provide enough
         * safety margin for any existing environment definitions and still
         * allow for more than enough dynamic additions. Note that the
-        * "size" argument is supposed to give the maximum enviroment size
+        * "size" argument is supposed to give the maximum environment size
         * (CONFIG_ENV_SIZE).  This heuristics will result in
         * unreasonably large numbers (and thus memory footprint) for
         * big flash environments (>8,000 entries for 64 KB
-        * envrionment size), so we clip it to a reasonable value.
+        * environment size), so we clip it to a reasonable value.
         * On the other hand we need to add some more entries for free
         * space when importing very small buffers. Both boundaries can
         * be overwritten in the board config file if needed.
@@ -841,6 +842,23 @@ int himport_r(struct hsearch_data *htab,
                }
        }
 
+       if (!size) {
+               free(data);
+               return 1;               /* everything OK */
+       }
+       if(crlf_is_lf) {
+               /* Remove Carriage Returns in front of Line Feeds */
+               unsigned ignored_crs = 0;
+               for(;dp < data + size && *dp; ++dp) {
+                       if(*dp == '\r' &&
+                          dp < data + size - 1 && *(dp+1) == '\n')
+                               ++ignored_crs;
+                       else
+                               *(dp-ignored_crs) = *dp;
+               }
+               size -= ignored_crs;
+               dp = data;
+       }
        /* Parse environment; allow for '\0' and 'sep' as separators */
        do {
                ENTRY e, *rv;
@@ -891,6 +909,7 @@ int himport_r(struct hsearch_data *htab,
                if (*name == 0) {
                        debug("INSERT: unable to use an empty key\n");
                        __set_errno(EINVAL);
+                       free(data);
                        return 0;
                }