Dear Joe Hershberger,

In message <1348264998-27323-2-git-send-email-joe.hershber...@ni.com> you wrote:
> Add support for callbacks to the "hashtable" functions.
...
> +/*
> + * Iterate through the whole list calling the callback for each found 
> element.
> + */
> +int env_attr_walk(const char *attr_list,
> +     int (*callback)(const char *name, const char *value))
> +{
> +     const char *entry, *entry_end;
> +     char *name, *value;
> +
> +     if (!attr_list)
> +             /* list not found */
> +             return 1;
> +
> +     entry = attr_list;
> +     do {
> +             char *entry_cpy = NULL;
> +
> +             entry_end = strchr(entry, ENV_ATTR_LIST_DELIM);
> +             if (entry_end == NULL) {
> +                     int entry_len = strlen(entry);
> +
> +                     if (entry_len) {
> +                             entry_cpy = malloc(entry_len + 1);
--------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +                             if (entry_cpy)
> +                                     strcpy(entry_cpy, entry);
> +                             else
> +                                     return -ENOMEM;
> +                     }
> +             } else {
> +                     int entry_len = entry_end - entry;
> +
> +                     if (entry_len) {
> +                             entry_cpy = malloc(entry_len + 1);
--------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +                             if (entry_cpy) {
> +                                     strncpy(entry_cpy, entry, entry_len);
> +                                     entry_cpy[entry_len] = '\0';
> +                             } else
> +                                     return -ENOMEM;
> +                     }
> +             }

I find it a bit strange that a function which walks an existing list
of data structures would malloc() anything?

> +             if (entry_cpy != NULL) {
> +                     value = strchr(entry_cpy, ENV_ATTR_SEP);
> +                     if (value != NULL) {
> +                             *value++ = '\0';
> +                             value = strim(value);
> +                     }
> +                     name = strim(entry_cpy);
> +
> +                     if (strlen(name) != 0) {
> +                             int retval = 0;
> +
> +                             retval = callback(name, value);
> +                             if (retval) {
> +                                     free(entry_cpy);
> +                                     return retval;
> +                             }
> +                     }
> +             }
> +
> +             free(entry_cpy);
> +             entry = entry_end + 1;
> +     } while (entry_end != NULL);
> +
> +     return 0;
> +}

Actually, this function is unreadable to me, especially because there
is zero documentation about what exactly it is supposed to do,  which
data formats are being used, etc.

> +/*
> + * Retrieve the attributes string associated with a single name in the list
> + * There is no protection on attributes being too small for the value
> + */
> +int env_attr_lookup(const char *attr_list, const char *name, char 
> *attributes)

Atttributes in a list?

What exactly has this to do with implementing callbacks?

[Yes, I think I do know what you have in mind, but this is based on a
lot of speculation, and I may be wrong.  And people who didn't follow
the previous discussion and the old patch seris probably have no clue
at all.]

> +     entry = strstr(attr_list, name);
> +     while (entry != NULL) {
> +             if ((entry == attr_list ||
> +                 *(entry - 1) == ENV_ATTR_LIST_DELIM ||
> +                 *(entry - 1) == ' ') &&
> +                 (*(entry + strlen(name)) == ENV_ATTR_SEP ||
> +                  *(entry + strlen(name)) == ENV_ATTR_LIST_DELIM ||
> +                  *(entry + strlen(name)) == '\0' ||
> +                  *(entry + strlen(name)) == ' '))

Factor out strlen() ?

...
> diff --git a/include/env_attr.h b/include/env_attr.h
> new file mode 100644
> index 0000000..62a3667
> --- /dev/null
> +++ b/include/env_attr.h
...
> +#define ENV_ATTR_LIST_DELIM  ','
> +#define ENV_ATTR_SEP         ':'
> +
> +extern int env_attr_walk(const char *attr_list,
> +     int (*callback)(const char *name, const char *value));
> +extern int env_attr_lookup(const char *attr_list, const char *name,
> +     char *attributes);

This does need documentation...

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
You're dead, Jim.
        -- McCoy, "The Tholian Web", stardate unknown
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to