Win32: keep the environment sorted
commit37d2265b15bebcf7151cd5dd3c5dbb8a9cefa6bc
authorKarsten Blees <blees@dcon.de>
Sun, 9 Oct 2011 00:08:31 +0000 (9 02:08 +0200)
committerKarsten Blees <blees@dcon.de>
Thu, 1 Dec 2011 14:58:02 +0000 (1 15:58 +0100)
tree59f4f54deafcd55f832f3799da84f18ab9662887
parent52980649b1a8c0d86e75b184e9cb1be9ebf14735
Win32: keep the environment sorted

The Windows environment is sorted, keep it that way for O(log n)
environment access.

Change compareenv to compare only the keys, so that it can be used to
find an entry irrespective of the value.

Change lookupenv to binary seach for an entry. Return one's complement of
the insert position if not found (libc's bsearch return's NULL). If a
case-insensitive match is found, try to find a better case-sensitive match
around that entry.

Change do_putenv to insert new entries at the correct position. Simplify
the function by swapping if conditions and using memmove instead of for
loops.

Move qsort from make_environment_block to mingw_startup. We still need to
sort on startup to make sure that the environment is sorted according to
our compareenv function (while Win32 / CreateProcess requires the
environment block to be sorted case-insensitively, CreateProcess currently
doesn't enforce this, and some applications such as bash just don't care).

Signed-off-by: Karsten Blees <blees@dcon.de>
compat/mingw.c