[U-Boot] [PATCH 3/5] Add hash table support as base for new environment code

Wolfgang Denk wd at denx.de
Sun Sep 12 21:16:51 CEST 2010


Dear Wolfgang Denk,

In message <1279395948-25864-4-git-send-email-wd at denx.de> you wrote:
> This implementation is based on code from uClibc-0.9.30.3 but was
> modified and extended for use within U-Boot.
> 
> Major modifications and extensions:
> 
> * hsearch() [modified / extended]:
>   - While the standard version does not make any assumptions about
>     the type of the stored data objects at all, this implementation
>     works with NUL terminated strings only.
>   - Instead of storing just pointers to the original objects, we
>     create local copies so the caller does not need to care about the
>     data any more.
>   - The standard implementation does not provide a way to update an
>     existing entry.  This version will create a new entry or update an
>     existing one when both "action == ENTER" and "item.data != NULL".
>   - hsearch_r(): Instead of returning 1 on success, we return the
>     index into the internal hash table, which is also guaranteed to be
>     positive.  This allows us direct access to the found hash table
>     slot for example for functions like hdelete().
> * hdelete() [added]:
>   - The standard implementation of hsearch(3) does not provide any way
>     to delete any entries from the hash table.  We extend the code to
>     do that.
> * hexport() [added]:
>   - Export the data stored in the hash table in linearized form:
>     Entries are exported as "name=value" strings, separated by an
>     arbitrary (non-NUL, of course) separator character. This allows to
>     use this function both when formatting the U-Boot environment for
>     external storage (using '\0' as separator), but also when using it
>     for the "printenv" command to print all variables, simply by using
>     as '\n" as separator. This can also be used for new features like
>     exporting the environment data as text file, including the option
>     for later re-import.
>   - The entries in the result list will be sorted by ascending key
>     values.
> * himport() [added]:
>   - Import linearized data into hash table.  This is the inverse
>     function to hexport(): it takes a linear list of "name=value"
>     pairs and creates hash table entries from it.
>   - Entries without "value", i. e. consisting of only "name" or
>     "name=", will cause this entry to be deleted from the hash table.
>   - The "flag" argument can be used to control the behaviour: when
>     the H_NOCLEAR bit is set, then an existing hash table will kept,
>     i. e. new data will be added to an existing hash table;
>     otherwise, old data will be discarded and a new hash table will
>     be created.
>   - The separator character for the "name=value" pairs can be
>     selected, so we both support importing from externally stored
>     environment data (separated by NUL characters) and from plain text
>     files (entries separated by newline characters).
>   - To allow for nicely formatted text input, leading white space
>     (sequences of SPACE and TAB chars) is ignored, and entries
>     starting (after removal of any leading white space) with a '#'
>     character are considered comments and ignored.
>   - NOTE: this means that a variable name cannot start with a '#'
>     character.
>   - When using a non-NUL separator character, backslash is used as
>     escape character in the value part, allowing for example fo
>     multi-line values.
>   - In theory, arbitrary separator characters can be used, but only
>     '\0' and '\n' have really been tested.
> 
> Signed-off-by: Wolfgang Denk <wd at denx.de>
> ---
>  include/search.h |  106 ++++++++
>  lib/Makefile     |    1 +
>  lib/hashtable.c  |  721 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 828 insertions(+), 0 deletions(-)
>  create mode 100644 include/search.h
>  create mode 100644 lib/hashtable.c

Applied to "next" branch.

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
It seems intuitively obvious to me, which  means  that  it  might  be
wrong.                                                 -- Chris Torek


More information about the U-Boot mailing list