]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - lib/hashtable.c
spi: omap3_spi: add am43xx support to omap3_spi
[karo-tx-uboot.git] / lib / hashtable.c
index 1703941a5ab3f704d905ec46b9262a5994e26925..18ed5901ec284b63150435bf5af9b8db6b42d373 100644 (file)
  * This file is part of the GNU C Library.
  * Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1993.
  *
- * The GNU C Library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * The GNU C Library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the GNU C Library; if not, write to the Free
- * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
+ * SPDX-License-Identifier:    LGPL-2.1+
  */
 
 #include <errno.h>
@@ -57,6 +44,7 @@
 #include <env_callback.h>
 #include <env_flags.h>
 #include <search.h>
+#include <slre.h>
 
 /*
  * [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986
@@ -540,7 +528,7 @@ static int cmpkey(const void *p1, const void *p2)
        return (strcmp(e1->key, e2->key));
 }
 
-static int match_string(int flag, const char *str, const char *pat)
+static int match_string(int flag, const char *str, const char *pat, void *priv)
 {
        switch (flag & H_MATCH_METHOD) {
        case H_MATCH_IDENT:
@@ -551,6 +539,17 @@ static int match_string(int flag, const char *str, const char *pat)
                if (strstr(str, pat))
                        return 1;
                break;
+#ifdef CONFIG_REGEX
+       case H_MATCH_REGEX:
+               {
+                       struct slre *slrep = (struct slre *)priv;
+                       struct cap caps[slrep->num_caps + 2];
+
+                       if (slre_match(slrep, str, strlen(str), caps))
+                               return 1;
+               }
+               break;
+#endif
        default:
                printf("## ERROR: unsupported match method: 0x%02x\n",
                        flag & H_MATCH_METHOD);
@@ -563,14 +562,25 @@ static int match_entry(ENTRY *ep, int flag,
                 int argc, char * const argv[])
 {
        int arg;
+       void *priv = NULL;
+
+       for (arg = 0; arg < argc; ++arg) {
+#ifdef CONFIG_REGEX
+               struct slre slre;
 
-       for (arg = 1; arg < argc; ++arg) {
+               if (slre_compile(&slre, argv[arg]) == 0) {
+                       printf("Error compiling regex: %s\n", slre.err_str);
+                       return 0;
+               }
+
+               priv = (void *)&slre;
+#endif
                if (flag & H_MATCH_KEY) {
-                       if (match_string(flag, ep->key, argv[arg]))
+                       if (match_string(flag, ep->key, argv[arg], priv))
                                return 1;
                }
                if (flag & H_MATCH_DATA) {
-                       if (match_string(flag, ep->data, argv[arg]))
+                       if (match_string(flag, ep->data, argv[arg], priv))
                                return 1;
                }
        }
@@ -766,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];
@@ -807,7 +817,7 @@ 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
@@ -831,6 +841,21 @@ int himport_r(struct hsearch_data *htab,
                }
        }
 
+       if(!size)
+               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;
@@ -878,6 +903,12 @@ int himport_r(struct hsearch_data *htab,
                *sp++ = '\0';   /* terminate value */
                ++dp;
 
+               if (*name == 0) {
+                       debug("INSERT: unable to use an empty key\n");
+                       __set_errno(EINVAL);
+                       return 0;
+               }
+
                /* Skip variables which are not supposed to be processed */
                if (!drop_var_from_set(name, nvars, localvars))
                        continue;