/src/xpdf-4.04/goo/GList.cc
Line | Count | Source (jump to first uncovered line) |
1 | | //======================================================================== |
2 | | // |
3 | | // GList.cc |
4 | | // |
5 | | // Copyright 2001-2003 Glyph & Cog, LLC |
6 | | // |
7 | | //======================================================================== |
8 | | |
9 | | #include <aconf.h> |
10 | | |
11 | | #ifdef USE_GCC_PRAGMAS |
12 | | #pragma implementation |
13 | | #endif |
14 | | |
15 | | #include <stdlib.h> |
16 | | #include <string.h> |
17 | | #include "gmem.h" |
18 | | #include "gmempp.h" |
19 | | #include "GList.h" |
20 | | |
21 | | //------------------------------------------------------------------------ |
22 | | // GList |
23 | | //------------------------------------------------------------------------ |
24 | | |
25 | 518k | GList::GList() { |
26 | 518k | size = 8; |
27 | 518k | data = (void **)gmallocn(size, sizeof(void*)); |
28 | 518k | length = 0; |
29 | 518k | inc = 0; |
30 | 518k | } |
31 | | |
32 | 0 | GList::GList(int sizeA) { |
33 | 0 | size = sizeA ? sizeA : 8; |
34 | 0 | data = (void **)gmallocn(size, sizeof(void*)); |
35 | 0 | length = 0; |
36 | 0 | inc = 0; |
37 | 0 | } |
38 | | |
39 | 518k | GList::~GList() { |
40 | 518k | gfree(data); |
41 | 518k | } |
42 | | |
43 | 0 | GList *GList::copy() { |
44 | 0 | GList *ret; |
45 | |
|
46 | 0 | ret = new GList(length); |
47 | 0 | ret->length = length; |
48 | 0 | memcpy(ret->data, data, length * sizeof(void *)); |
49 | 0 | ret->inc = inc; |
50 | 0 | return ret; |
51 | 0 | } |
52 | | |
53 | 803k | void GList::append(void *p) { |
54 | 803k | if (length >= size) { |
55 | 7.77k | expand(); |
56 | 7.77k | } |
57 | 803k | data[length++] = p; |
58 | 803k | } |
59 | | |
60 | 0 | void GList::append(GList *list) { |
61 | 0 | int i; |
62 | |
|
63 | 0 | while (length + list->length > size) { |
64 | 0 | expand(); |
65 | 0 | } |
66 | 0 | for (i = 0; i < list->length; ++i) { |
67 | 0 | data[length++] = list->data[i]; |
68 | 0 | } |
69 | 0 | } |
70 | | |
71 | 0 | void GList::insert(int i, void *p) { |
72 | 0 | if (length >= size) { |
73 | 0 | expand(); |
74 | 0 | } |
75 | 0 | if (i < 0) { |
76 | 0 | i = 0; |
77 | 0 | } |
78 | 0 | if (i < length) { |
79 | 0 | memmove(data+i+1, data+i, (length - i) * sizeof(void *)); |
80 | 0 | } |
81 | 0 | data[i] = p; |
82 | 0 | ++length; |
83 | 0 | } |
84 | | |
85 | 0 | void *GList::del(int i) { |
86 | 0 | void *p; |
87 | |
|
88 | 0 | p = data[i]; |
89 | 0 | if (i < length - 1) { |
90 | 0 | memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *)); |
91 | 0 | } |
92 | 0 | --length; |
93 | 0 | if (size - length >= ((inc > 0) ? inc : size/2)) { |
94 | 0 | shrink(); |
95 | 0 | } |
96 | 0 | return p; |
97 | 0 | } |
98 | | |
99 | 0 | void GList::sort(int (*cmp)(const void *obj1, const void *obj2)) { |
100 | 0 | qsort(data, length, sizeof(void *), cmp); |
101 | 0 | } |
102 | | |
103 | 0 | void GList::reverse() { |
104 | 0 | void *t; |
105 | 0 | int n, i; |
106 | |
|
107 | 0 | n = length / 2; |
108 | 0 | for (i = 0; i < n; ++i) { |
109 | 0 | t = data[i]; |
110 | 0 | data[i] = data[length - 1 - i]; |
111 | 0 | data[length - 1 - i] = t; |
112 | 0 | } |
113 | 0 | } |
114 | | |
115 | 7.77k | void GList::expand() { |
116 | 7.77k | size += (inc > 0) ? inc : size; |
117 | 7.77k | data = (void **)greallocn(data, size, sizeof(void*)); |
118 | 7.77k | } |
119 | | |
120 | 0 | void GList::shrink() { |
121 | 0 | size -= (inc > 0) ? inc : size/2; |
122 | 0 | data = (void **)greallocn(data, size, sizeof(void*)); |
123 | 0 | } |