Coverage Report

Created: 2023-09-25 06:30

/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
0
GList::GList() {
26
0
  size = 8;
27
0
  data = (void **)gmallocn(size, sizeof(void*));
28
0
  length = 0;
29
0
  inc = 0;
30
0
}
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
0
GList::~GList() {
40
0
  gfree(data);
41
0
}
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
0
void GList::append(void *p) {
54
0
  if (length >= size) {
55
0
    expand();
56
0
  }
57
0
  data[length++] = p;
58
0
}
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
0
void GList::expand() {
116
0
  size += (inc > 0) ? inc : size;
117
0
  data = (void **)greallocn(data, size, sizeof(void*));
118
0
}
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
}