[U-Boot] [RFC PATCH 1/5] env: Add support for callbacks to environment vars
Wolfgang Denk
wd at denx.de
Wed Sep 26 21:33:06 CEST 2012
Dear Joe Hershberger,
In message <1348264998-27323-2-git-send-email-joe.hershberger at 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: wd at denx.de
You're dead, Jim.
-- McCoy, "The Tholian Web", stardate unknown
More information about the U-Boot
mailing list