-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathqueue.c
79 lines (64 loc) · 1.69 KB
/
queue.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
* Twin - A Tiny Window System
* Copyright (c) 2004 Keith Packard <[email protected]>
* Copyright (c) 2024 National Cheng Kung University, Taiwan
* All rights reserved.
*/
#include <stdlib.h>
#include "twin_private.h"
void _twin_queue_insert(twin_queue_t **head,
twin_queue_proc_t proc,
twin_queue_t *new)
{
twin_queue_t **prev, *q;
for (prev = head; (q = *prev); prev = &q->next)
if ((*proc)(new, q) == TWIN_AFTER)
break;
new->next = *prev;
new->order = 0;
new->deleted = false;
*prev = new;
}
void _twin_queue_remove(twin_queue_t **head, twin_queue_t *old)
{
twin_queue_t **prev, *q;
for (prev = head; (q = *prev); prev = &q->next)
if (q == old) {
*prev = q->next;
break;
}
}
void _twin_queue_reorder(twin_queue_t **head,
twin_queue_proc_t proc,
twin_queue_t *elem)
{
twin_queue_t **prev, *q;
_twin_queue_remove(head, elem);
for (prev = head; (q = *prev); prev = &q->next)
if ((*proc)(elem, q) == TWIN_AFTER)
break;
elem->next = *prev;
*prev = elem;
}
void _twin_queue_delete(twin_queue_t **head, twin_queue_t *old)
{
_twin_queue_remove(head, old);
old->deleted = true;
}
twin_queue_t *_twin_queue_set_order(twin_queue_t **head)
{
twin_queue_t *first = *head;
for (twin_queue_t *q = first; q; q = q->next)
q->order = q->next;
return first;
}
void _twin_queue_review_order(twin_queue_t *first)
{
twin_queue_t *q, *o;
for (q = first; q; q = o) {
o = q->order;
q->order = 0;
if (q->deleted)
free(q);
}
}