• Paul Eggert's avatar
    Vector-sorting fixes. · f9caea82
    Paul Eggert authored
    It's not safe to call qsort or qsort_r, since they have undefined
    behavior if the user-specified predicate is not a total order.
    Also, watch out for garbage-collection while sorting vectors.
    * admin/merge-gnulib (GNULIB_MODULES): Add vla.
    * configure.ac (qsort_r): Remove, as we no longer use qsort-like
    functions.
    * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
    * lib/vla.h, m4/vararrays.m4: New files, copied from gnulib.
    * lib/stdlib.in.h, m4/stdlib_h.m4: Sync from gnulib, incorporating:
    2014-08-29 qsort_r: new module, for GNU-style qsort_r
    The previous two files' changes are boilerplate generated by
    admin/merge-gnulib, and should not affect Emacs.
    * src/fns.c: Include <vla.h>.
    (sort_vector_predicate) [!HAVE_QSORT_R]: Remove.
    (sort_vector_compare): Remove, replacing with ....
    (inorder, merge_vectors, sort_vector_inplace, sort_vector_copy):
    ... these new functions.
    (sort_vector): Rewrite to use the new functions.
    GCPRO locals, since the predicate can invoke the GC.
    Since it's in-place return void; caller changed.
    (merge): Use 'inorder', for clarity.
    
    Fixes: debbugs:18361
    f9caea82
configure.ac 174 KB