diff options
| author | Dmitry Antipov | 2014-08-29 20:21:30 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2014-08-29 20:21:30 +0400 |
| commit | 42d819e9de99996f09c124244dc577bf264ac350 (patch) | |
| tree | 579e6d6222e178ad99162a9370d1bb5d15dc845d /src | |
| parent | 69149b6cc38977bc2584541f745334d1e5b0f3dc (diff) | |
| download | emacs-42d819e9de99996f09c124244dc577bf264ac350.tar.gz emacs-42d819e9de99996f09c124244dc577bf264ac350.zip | |
Fix last change to support Darwin/OSX (Bug#18354).
* sysdep.c (sort_vector_compare) [DARWIN_OS || __FreeBSD__]:
Conditionally define to match system's qsort_r signature.
(sort_vector) [DARWIN_OS || __FreeBSD__]: Likewise in call to qsort_r.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 5 | ||||
| -rw-r--r-- | src/fns.c | 23 |
2 files changed, 23 insertions, 5 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index c24ca69536f..2a78c4b4fa9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -9,6 +9,11 @@ | |||
| 9 | * lisp.h (enum Lisp_Save_Type): New member SAVE_TYPE_INT_OBJ. | 9 | * lisp.h (enum Lisp_Save_Type): New member SAVE_TYPE_INT_OBJ. |
| 10 | (make_save_int_obj): Add prototype. | 10 | (make_save_int_obj): Add prototype. |
| 11 | 11 | ||
| 12 | Fix last change to support Darwin/OSX (Bug#18354). | ||
| 13 | * sysdep.c (sort_vector_compare) [DARWIN_OS || __FreeBSD__]: | ||
| 14 | Conditionally define to match system's qsort_r signature. | ||
| 15 | (sort_vector) [DARWIN_OS || __FreeBSD__]: Likewise in call to qsort_r. | ||
| 16 | |||
| 12 | 2014-08-28 Ken Brown <kbrown@cornell.edu> | 17 | 2014-08-28 Ken Brown <kbrown@cornell.edu> |
| 13 | 18 | ||
| 14 | Add support for HYBRID_MALLOC, allowing the use of gmalloc before | 19 | Add support for HYBRID_MALLOC, allowing the use of gmalloc before |
| @@ -1876,7 +1876,8 @@ sort_list (Lisp_Object list, Lisp_Object predicate) | |||
| 1876 | return merge (front, back, predicate); | 1876 | return merge (front, back, predicate); |
| 1877 | } | 1877 | } |
| 1878 | 1878 | ||
| 1879 | /* Using GNU qsort_r, we can pass this as a parameter. */ | 1879 | /* Using GNU qsort_r, we can pass this as a parameter. This also |
| 1880 | exists on FreeBSD and Darwin/OSX, but with a different signature. */ | ||
| 1880 | #ifndef HAVE_QSORT_R | 1881 | #ifndef HAVE_QSORT_R |
| 1881 | static Lisp_Object sort_vector_predicate; | 1882 | static Lisp_Object sort_vector_predicate; |
| 1882 | #endif | 1883 | #endif |
| @@ -1885,16 +1886,22 @@ static Lisp_Object sort_vector_predicate; | |||
| 1885 | 1886 | ||
| 1886 | static int | 1887 | static int |
| 1887 | #ifdef HAVE_QSORT_R | 1888 | #ifdef HAVE_QSORT_R |
| 1889 | #if defined (DARWIN_OS) || defined (__FreeBSD__) | ||
| 1890 | sort_vector_compare (void *arg, const void *p, const void *q) | ||
| 1891 | #elif defined (GNU_LINUX) | ||
| 1888 | sort_vector_compare (const void *p, const void *q, void *arg) | 1892 | sort_vector_compare (const void *p, const void *q, void *arg) |
| 1889 | #else | 1893 | #else /* neither darwin/bsd nor gnu/linux */ |
| 1894 | #error "check how qsort_r comparison function works on your platform" | ||
| 1895 | #endif /* DARWIN_OS || __FreeBSD__ */ | ||
| 1896 | #else /* not HAVE_QSORT_R */ | ||
| 1890 | sort_vector_compare (const void *p, const void *q) | 1897 | sort_vector_compare (const void *p, const void *q) |
| 1891 | #endif /* HAVE_QSORT_R */ | 1898 | #endif /* HAVE_QSORT_R */ |
| 1892 | { | 1899 | { |
| 1893 | bool more, less; | 1900 | bool more, less; |
| 1894 | Lisp_Object op, oq, vp, vq; | 1901 | Lisp_Object op, oq, vp, vq; |
| 1895 | #ifdef HAVE_QSORT_R | 1902 | #ifdef HAVE_QSORT_R |
| 1896 | Lisp_Object sort_vector_predicate = *(Lisp_Object *) arg; | 1903 | Lisp_Object sort_vector_predicate = *(Lisp_Object *) arg; |
| 1897 | #endif | 1904 | #endif |
| 1898 | 1905 | ||
| 1899 | op = *(Lisp_Object *) p; | 1906 | op = *(Lisp_Object *) p; |
| 1900 | oq = *(Lisp_Object *) q; | 1907 | oq = *(Lisp_Object *) q; |
| @@ -1928,8 +1935,14 @@ sort_vector (Lisp_Object vector, Lisp_Object predicate) | |||
| 1928 | 1935 | ||
| 1929 | /* Setup predicate and sort. */ | 1936 | /* Setup predicate and sort. */ |
| 1930 | #ifdef HAVE_QSORT_R | 1937 | #ifdef HAVE_QSORT_R |
| 1938 | #if defined (DARWIN_OS) || defined (__FreeBSD__) | ||
| 1939 | qsort_r (v, len, word_size, (void *) &predicate, sort_vector_compare); | ||
| 1940 | #elif defined (GNU_LINUX) | ||
| 1931 | qsort_r (v, len, word_size, sort_vector_compare, (void *) &predicate); | 1941 | qsort_r (v, len, word_size, sort_vector_compare, (void *) &predicate); |
| 1932 | #else | 1942 | #else /* neither darwin/bsd nor gnu/linux */ |
| 1943 | #error "check how qsort_r works on your platform" | ||
| 1944 | #endif /* DARWIN_OS || __FreeBSD__ */ | ||
| 1945 | #else /* not HAVE_QSORT_R */ | ||
| 1933 | sort_vector_predicate = predicate; | 1946 | sort_vector_predicate = predicate; |
| 1934 | qsort (v, len, word_size, sort_vector_compare); | 1947 | qsort (v, len, word_size, sort_vector_compare); |
| 1935 | #endif /* HAVE_QSORT_R */ | 1948 | #endif /* HAVE_QSORT_R */ |