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;
}
|