File: array.c

package info (click to toggle)
wmii2 2.5.2-11
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 608 kB
  • ctags: 925
  • sloc: ansic: 9,195; makefile: 184; sh: 11
file content (98 lines) | stat: -rw-r--r-- 1,966 bytes parent folder | download | duplicates (3)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com>
 * See LICENSE file for license details.
 */

#include <stdlib.h>

#include "cext.h"

void          **
attach_item_begin(void **old, void *item, size_t size_item)
{
	int             i, size_old;
	void          **result = 0;
	for (size_old = 0; old && old[size_old]; size_old++);
	result = emalloc(size_item * (size_old + 2));
	result[0] = item;
	for (i = 0; old && old[i]; i++)
		result[i + 1] = old[i];
	result[i + 1] = 0;
	if (old)
		free(old);
	return result;
}

void          **
attach_item_end(void **old, void *item, size_t size_item)
{
	int             i, size_old;
	void          **result = 0;
	for (size_old = 0; old && old[size_old]; size_old++);
	result = emalloc(size_item * (size_old + 2));
	for (i = 0; old && old[i]; i++)
		result[i] = old[i];
	result[i++] = item;
	result[i] = 0;
	if (old)
		free(old);
	return result;
}

void          **
detach_item(void **old, void *item, size_t size_item)
{
	int             size_old, i, j = 0;
	void          **result = 0;
	for (size_old = 0; old && old[size_old]; size_old++);
	if (size_old != 1) {
		result = emalloc(size_item * size_old);
		for (i = 0; old[i]; i++)
			if (old[i] != item)
				result[j++] = old[i];
		result[j] = 0;
	}
	if (old)
		free(old);
	return result;
}

int
index_item(void **items, void *item)
{
	int             i = 0;
	for (i = 0; items && items[i] && (items[i] != item); i++);
	return items[i] ? i : -1;
}

int
count_items(void **items)
{
	int             i;
	for (i = 0; items && items[i]; i++);
	return i;
}

int
index_next_item(void **items, void *item)
{
	int             idx = index_item(items, item);
	if (idx == -1)
		return idx;
	if (idx == count_items(items) - 1)
		return 0;
	else
		return idx + 1;
}

int
index_prev_item(void **items, void *item)
{
	int             idx = index_item(items, item);
	if (idx == -1)
		return idx;
	if (idx == 0)
		return count_items(items) - 1;
	else
		return idx - 1;
}