076c1de6a1aa91a2f21828c6d706438e7fc75452
[platform/upstream/kbd.git] / src / libkeymap / array.c
1 #include "config.h"
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <errno.h>
7 #include <sys/types.h>
8
9 #include <keymap/array.h>
10
11 int lk_array_init(struct lk_array *a, size_t memb, size_t size)
12 {
13         if (!a)
14                 return -EINVAL;
15
16         memset(a, 0, sizeof(struct lk_array));
17
18         a->array = calloc(size, memb);
19         a->memb  = memb;
20         a->total = size;
21
22         if (size && !a->array)
23                 return -ENOMEM;
24
25         return 0;
26 }
27
28 int lk_array_free(struct lk_array *a)
29 {
30         if (!a)
31                 return -EINVAL;
32         free(a->array);
33         memset(a, 0, sizeof(struct lk_array));
34         return 0;
35 }
36
37 int lk_array_empty(struct lk_array *a)
38 {
39         if (!a)
40                 return -EINVAL;
41
42         memset(a->array, 0, (a->memb * a->total));
43         a->count = 0;
44
45         return 0;
46 }
47
48 int lk_array_exists(struct lk_array *a, unsigned int i)
49 {
50         char *s;
51         size_t k;
52
53         if (!a || i >= a->total) {
54                 return 0;
55         }
56
57         s = (char *)(a->array + (a->memb * i));
58
59         for (k = 0; k < a->memb; k++) {
60                 if (s[k] != 0)
61                         return 1;
62         }
63
64         return 0;
65 }
66
67 void *
68 lk_array_get(struct lk_array *a, unsigned int i)
69 {
70         if (!a || i >= a->total) {
71                 return NULL;
72         }
73         return a->array + (a->memb * i);
74 }
75
76 void *
77 lk_array_get_ptr(struct lk_array *a, unsigned int i)
78 {
79         void **ptr;
80         if (!a || i >= a->total) {
81                 return NULL;
82         }
83         ptr = a->array;
84         return *(ptr + i);
85 }
86
87 static int
88 array_resize(struct lk_array *a, unsigned int i)
89 {
90         if (!a)
91                 return -EINVAL;
92
93         if (i >= a->total) {
94                 void *tmp = realloc(a->array, a->memb * (i + 1));
95                 if (!tmp)
96                         return -ENOMEM;
97
98                 memset(tmp + (a->memb * a->total), 0, a->memb * (i + 1 - a->total));
99
100                 a->array = tmp;
101                 a->total = i + 1;
102         }
103         return 0;
104 }
105
106 int lk_array_set(struct lk_array *a, unsigned int i, const void *e)
107 {
108         int ret = array_resize(a, i);
109
110         if (ret < 0)
111                 return ret;
112
113         memcpy(a->array + (a->memb * i), e, a->memb);
114         a->count++;
115
116         return 0;
117 }
118
119 int lk_array_unset(struct lk_array *a, unsigned int i)
120 {
121         if (!a || i >= a->total)
122                 return -EINVAL;
123
124         if (lk_array_exists(a, i)) {
125                 memset(a->array + (a->memb * i), 0, a->memb);
126                 a->count--;
127         }
128
129         return 0;
130 }
131
132 int lk_array_append(struct lk_array *a, const void *e)
133 {
134         int ret = array_resize(a, a->count);
135
136         if (ret < 0)
137                 return ret;
138
139         memcpy(a->array + (a->memb * a->count), e, a->memb);
140         a->count++;
141
142         return 0;
143 }