Groonga 3.0.9 Source Code Document
Main Page
Related Pages
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Pages
groonga
vendor
nginx-1.4.2
src
core
ngx_queue.c
Go to the documentation of this file.
1
2
/*
3
* Copyright (C) Igor Sysoev
4
* Copyright (C) Nginx, Inc.
5
*/
6
7
8
#include <
ngx_config.h
>
9
#include <
ngx_core.h
>
10
11
12
/*
13
* find the middle queue element if the queue has odd number of elements
14
* or the first element of the queue's second part otherwise
15
*/
16
17
ngx_queue_t
*
18
ngx_queue_middle
(
ngx_queue_t
*queue)
19
{
20
ngx_queue_t
*middle, *next;
21
22
middle =
ngx_queue_head
(queue);
23
24
if
(middle ==
ngx_queue_last
(queue)) {
25
return
middle;
26
}
27
28
next =
ngx_queue_head
(queue);
29
30
for
( ;; ) {
31
middle =
ngx_queue_next
(middle);
32
33
next =
ngx_queue_next
(next);
34
35
if
(next ==
ngx_queue_last
(queue)) {
36
return
middle;
37
}
38
39
next =
ngx_queue_next
(next);
40
41
if
(next ==
ngx_queue_last
(queue)) {
42
return
middle;
43
}
44
}
45
}
46
47
48
/* the stable insertion sort */
49
50
void
51
ngx_queue_sort
(
ngx_queue_t
*queue,
52
ngx_int_t
(*cmp)(
const
ngx_queue_t
*,
const
ngx_queue_t
*))
53
{
54
ngx_queue_t
*q, *prev, *next;
55
56
q =
ngx_queue_head
(queue);
57
58
if
(q ==
ngx_queue_last
(queue)) {
59
return
;
60
}
61
62
for
(q =
ngx_queue_next
(q); q !=
ngx_queue_sentinel
(queue); q = next) {
63
64
prev =
ngx_queue_prev
(q);
65
next =
ngx_queue_next
(q);
66
67
ngx_queue_remove
(q);
68
69
do
{
70
if
(cmp(prev, q) <= 0) {
71
break
;
72
}
73
74
prev =
ngx_queue_prev
(prev);
75
76
}
while
(prev !=
ngx_queue_sentinel
(queue));
77
78
ngx_queue_insert_after
(prev, q);
79
}
80
}
Generated on Sun Nov 10 2013 09:49:06 for Groonga 3.0.9 Source Code Document by
1.8.1.2