implementation of mbox folder with unique messages numbers
[claws.git] / src / carray.c
1
2 /*
3  * libEtPan! -- a mail stuff library
4  *
5  * carray - Implements simple dynamic pointer arrays
6  *
7  * Copyright (c) 1999-2000, GaĆ«l Roualland <gael.roualland@iname.com>
8  * interface changes - 2002 - DINH Viet Hoa
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the libEtPan! project nor the names of its
20  *    contributors may be used to endorse or promote products derived
21  *    from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35
36 #include <stdlib.h>
37 #include <string.h>
38 #include "carray.h"
39
40 carray * carray_new(uint32_t initsize) {
41   carray * array;
42
43   array = (carray *) malloc(sizeof(carray));
44   if (!array) return NULL;
45
46   array->len = 0;
47   array->max = initsize;
48   array->array = (void **) malloc(sizeof(void *) * initsize);
49   if (!array->array) {
50     free(array);
51     return NULL;
52   }
53   return array;
54 }
55
56 int carray_add(carray * array, void * data, uint32_t * index) {
57   int r;
58   
59   r = carray_set_size(array, array->len + 1);
60   if (r < 0)
61     return r;
62
63   array->array[array->len - 1] = data;
64   if (index != NULL)
65     * index = array->len - 1;
66
67   return 0;
68 }
69
70 int carray_set_size(carray * array, uint32_t new_size)
71 {
72   if (new_size > array->max) {
73     uint32_t n = array->max * 2;
74     void * new;
75
76     while (n <= new_size)
77       n *= 2;
78
79     new = (void **) realloc(array->array, sizeof(void *) * n);
80     if (!new)
81       return -1;
82     array->array = new;
83     array->max = n;
84   }
85   array->len = new_size;
86
87   return 0;
88 }
89
90 int carray_delete_fast(carray * array, uint32_t indx) {
91   if (indx >= array->len)
92     return -1;
93
94   array->array[indx] = NULL;
95
96   return 0;
97 }
98
99 int carray_delete(carray * array, uint32_t indx) {
100   if (indx >= array->len)
101     return -1;
102
103   if (indx != --array->len)
104     array->array[indx] = array->array[array->len];
105   return 0;
106 }
107
108 int carray_delete_slow(carray * array, uint32_t indx) {
109   if (indx >= array->len)
110     return -1;
111
112   if (indx != --array->len) 
113     memmove(array->array + indx, array->array + indx + 1,
114             (array->len - indx) * sizeof(void *));
115   return 0;
116 }
117
118 #ifdef NO_MACROS
119 void ** carray_data(carray * array) {
120   return array->array;
121 }
122
123 uint32_t carray_count(carray * array) {
124   return array->len;
125 }
126
127 void * carray_get(carray * array, uint32_t indx) {
128   return array->array[indx];
129 }
130
131 void carray_set(carray * array, uint32_t indx, void * value) {
132   array->array[indx] = value;
133 }
134 #endif
135
136 void carray_free(carray * array) {
137   free(array->array);
138   free(array);
139 }