Don't cast qsort comparison function pointers.
commite2cc0bd4347d87e1735e203e1e3d8460a2ecfb6d
authorKalle Olavi Niemitalo <kon@iki.fi>
Sat, 6 Oct 2007 02:59:20 +0000 (6 05:59 +0300)
committerKalle Olavi Niemitalo <Kalle@Astalo.kon.iki.fi>
Sat, 6 Oct 2007 20:05:05 +0000 (6 23:05 +0300)
treef9c809158fb784039047129fd2b877039a10f6cf
parent4a6908c843567625fae10f1211562f5bfdeb6639
Don't cast qsort comparison function pointers.

Instead, convert the element pointers inside the comparison functions.

The last argument of qsort() is supposed to be of type
int (*)(const void *, const void *).  Previously, comp_links() was
defined to take struct link * instead of const void *, and the type
mismatch was silenced by casting the function pointer to void *.
This was in principle not portable because:

(1) The different pointer types may have different representations.
    In a word-oriented machine, the const void * might include a byte
    selector while the struct link * might not.

(2) Casting a function pointer to a data pointer can lose bits in some
    memory models.  Apparently this does not occur in POSIX-conforming
    systems though, as dlsym() would fail if it did.

This commit also fixes hits_cmp() and compare_dir_entries(), which
had similar problems.  However, I'm leaving alias_compare() in
src/intl/gettext/localealias.c unchanged for now, so as not to diverge
from the GNU version.

I also checked the bsearch() calls but they were all okay, apart from
one that used the alias_compare() mentioned above.
src/document/renderer.c
src/intl/charsets.c
src/util/file.c