GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: libexec/tradcpp/array.c Lines: 17 32 53.1 %
Date: 2017-11-13 Branches: 5 14 35.7 %

Line Branch Exec Source
1
/*-
2
 * Copyright (c) 2009 The NetBSD Foundation, Inc.
3
 * All rights reserved.
4
 *
5
 * This code is derived from software contributed to The NetBSD Foundation
6
 * by David A. Holland.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
 * POSSIBILITY OF SUCH DAMAGE.
28
 */
29
30
#include <stdlib.h>
31
#include <string.h>
32
33
#define ARRAYINLINE
34
#include "array.h"
35
36
struct array *
37
array_create(void)
38
{
39
	struct array *a;
40
41
	a = domalloc(sizeof(*a));
42
	array_init(a);
43
	return a;
44
}
45
46
void
47
array_destroy(struct array *a)
48
{
49
	array_cleanup(a);
50
	dofree(a, sizeof(*a));
51
}
52
53
void
54
array_init(struct array *a)
55
{
56
99416
	a->num = a->max = 0;
57
49708
	a->v = NULL;
58
49708
}
59
60
void
61
array_cleanup(struct array *a)
62
{
63
73100
	arrayassert(a->num == 0);
64
36550
	dofree(a->v, a->max * sizeof(a->v[0]));
65
#ifdef ARRAYS_CHECKED
66
36550
	a->v = NULL;
67
#endif
68
36550
}
69
70
void
71
array_setsize(struct array *a, unsigned num)
72
{
73
	unsigned newmax;
74
	void **newptr;
75
76
169592
	if (num > a->max) {
77
		newmax = a->max;
78
116960
		while (num > newmax) {
79
29240
			newmax = newmax ? newmax*2 : 4;
80
		}
81
58480
		newptr = dorealloc(a->v, a->max * sizeof(a->v[0]),
82
29240
				   newmax * sizeof(a->v[0]));
83
29240
		a->v = newptr;
84
29240
		a->max = newmax;
85
29240
	}
86
84796
	a->num = num;
87
84796
}
88
89
void
90
array_insert(struct array *a, unsigned index_)
91
{
92
	unsigned movers;
93
94
	arrayassert(a->num <= a->max);
95
	arrayassert(index_ < a->num);
96
97
	movers = a->num - index_;
98
99
	array_setsize(a, a->num + 1);
100
101
	memmove(a->v + index_+1, a->v + index_, movers*sizeof(*a->v));
102
}
103
104
void
105
array_remove(struct array *a, unsigned index_)
106
{
107
	unsigned movers;
108
109
	arrayassert(a->num <= a->max);
110
	arrayassert(index_ < a->num);
111
112
	movers = a->num - (index_ + 1);
113
	memmove(a->v + index_, a->v + index_+1, movers*sizeof(*a->v));
114
	a->num--;
115
}