changeset 1208:5eae5751507f

ngx_sort
author Igor Sysoev <igor@sysoev.ru>
date Mon, 21 May 2007 14:05:23 +0000
parents 103988cef757
children c6c33f81fd79
files src/core/ngx_string.c src/core/ngx_string.h
diffstat 2 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -1202,6 +1202,33 @@ done:
 }
 
 
+/* ngx_sort() is implemented as insertion sort because we need stable sort */
+
+void
+ngx_sort(void *base, size_t n, size_t size,
+    int (*cmp)(const void *, const void *))
+{
+    u_char  *p1, *p2;
+    u_char   buf[256];
+
+    for (p1 = (u_char *) base + size;
+         p1 < (u_char *) base + n * size;
+         p1 += size)
+    {
+        ngx_memcpy(buf, p1, size);
+
+        for (p2 = p1;
+             p2 > (u_char *) base && cmp(p2 - size, buf) > 0;
+             p2 -= size)
+        {
+            ngx_memcpy(p2, p2 - size, size);
+        }
+
+        ngx_memcpy(p2, buf, size);
+    }
+}
+
+
 #if (NGX_MEMCPY_LIMIT)
 
 void *
--- a/src/core/ngx_string.h
+++ b/src/core/ngx_string.h
@@ -150,6 +150,8 @@ uintptr_t ngx_escape_uri(u_char *dst, u_
 void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);
 
 
+void ngx_sort(void *base, size_t n, size_t size,
+    int (*cmp)(const void *, const void *));
 #define ngx_qsort            qsort