X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=inline;f=lib%2Fhashtable.c;h=4cdbc95329c0d9d5892d81eed39254fc13796f2a;hb=31bf0f57b2c322500ceccdc6a38b4a8edb7035f0;hp=1703941a5ab3f704d905ec46b9262a5994e26925;hpb=5a31ea04c9ee5544fbb70ad7597ea4b294840eab;p=u-boot diff --git a/lib/hashtable.c b/lib/hashtable.c index 1703941a5a..4cdbc95329 100644 --- a/lib/hashtable.c +++ b/lib/hashtable.c @@ -57,6 +57,7 @@ #include #include #include +#include /* * [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 @@ -540,7 +541,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 +552,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 +575,25 @@ static int match_entry(ENTRY *ep, int flag, int argc, char * const argv[]) { int arg; + void *priv = NULL; for (arg = 1; arg < argc; ++arg) { +#ifdef CONFIG_REGEX + struct slre slre; + + 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; } } @@ -878,6 +901,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;