Libical API Documentation 4.0 UNRELEASED Go to the stable 3.0 documentation
Loading...
Searching...
No Matches
icalstrarray.c
Go to the documentation of this file.
1/*======================================================================
2 FILE: icalstrarray.c
3 CREATOR: Ken Murchison 24 Aug 2022
4
5 SPDX-FileCopyrightText: 2022, Fastmail Pty. Ltd. (https://fastmail.com)
6 SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
7 ======================================================================*/
8
13
14#ifdef HAVE_CONFIG_H
15#include <config.h>
16#endif
17
18#include "icalstrarray.h"
19#include "icalmemory.h"
20
21#include <string.h>
22#include <stdint.h>
23
24size_t icalstrarray_size(const icalstrarray *array)
25{
26 if (!array) {
27 return 0;
28 }
29 return array->num_elements;
30}
31
32const char *icalstrarray_element_at(icalstrarray *array, size_t position)
33{
34 if (position >= icalstrarray_size(array)) {
35 return NULL;
36 }
37 return *((const char **)icalarray_element_at(array, position));
38}
39
40size_t icalstrarray_find(icalstrarray *array,
41 const char *needle)
42{
43 if (!array || !needle) {
44 return icalstrarray_size(array);
45 }
46
47 size_t i;
48
49 for (i = 0; i < array->num_elements; i++) {
50 const char *s = icalstrarray_element_at(array, i);
51 if (s && !strcmp(needle, s)) {
52 return i;
53 }
54 }
55
56 return array->num_elements;
57}
58
59void icalstrarray_append(icalstrarray *array, const char *elem)
60{
61 if (!array || !elem) {
62 return;
63 }
64
65 /* coverity[resource_leak] */
66 char *copy = icalmemory_strdup(elem);
67
68 icalarray_append(array, (const void *)&copy);
69}
70
71void icalstrarray_add(icalstrarray *array, const char *elem)
72{
73 if (!array || !elem) {
74 return;
75 }
76
77 if (icalstrarray_find(array, elem) >= icalstrarray_size(array)) {
78 icalstrarray_append(array, elem);
79 }
80}
81
82void icalstrarray_remove_element_at(icalstrarray *array, size_t position)
83{
84 if (position >= icalstrarray_size(array)) {
85 return;
86 }
87
88 char **del = (char **)icalarray_element_at(array, position);
89
90 if (del && *del) {
92 }
93 icalarray_remove_element_at(array, position);
94}
95
96void icalstrarray_remove(icalstrarray *array, const char *del)
97{
98 if (!array || !del) {
99 return;
100 }
101
102 size_t j = 0;
103
104 for (size_t i = 0; i < array->num_elements; i++) {
105 char **elem = (char **)icalarray_element_at(array, i);
106 if (strcmp(*elem, del) != 0) {
107 (void)icalarray_set_element_at(array, (const void *)elem, j++);
108 } else {
110 }
111 }
112
113 array->num_elements = j;
114}
115
116void icalstrarray_free(icalstrarray *array)
117{
118 if (!array) {
119 return;
120 }
121
122 for (size_t i = 0; i < array->num_elements; i++) {
123 char **del = (char **)icalarray_element_at(array, i);
124 if (del && *del) {
126 }
127 }
128
129 icalarray_free(array);
130}
131
132static int strpcmp(const char **a, const char **b)
133{
134 return strcmp(*a, *b);
135}
136
137void icalstrarray_sort(icalstrarray *array)
138{
139 if (!array) {
140 return;
141 }
142 icalarray_sort(array, (int (*)(const void *, const void *))&strpcmp);
143}
144
145icalstrarray *icalstrarray_clone(icalstrarray *array)
146{
147 if (!array) {
148 return NULL;
149 }
150
151 icalstrarray *clone = icalstrarray_new(array->increment_size);
152 size_t i;
153
154 for (i = 0; i < array->num_elements; i++) {
156 }
157
158 return clone;
159}
void * icalarray_element_at(icalarray *array, size_t position)
Access an array element.
Definition icalarray.c:135
void icalarray_free(icalarray *array)
Definition icalarray.c:104
void icalarray_sort(icalarray *array, int(*compare)(const void *, const void *))
Sorts the elements of an icalarray using the given comparison function.
Definition icalarray.c:182
void icalarray_append(icalarray *array, const void *element)
Appends an element to an array.
Definition icalarray.c:119
void icalarray_set_element_at(icalarray *array, const void *element, size_t position)
Overwrites an existing element in an array with a new value.
Definition icalarray.c:143
void icalarray_remove_element_at(icalarray *array, size_t position)
Removes a given element from an array.
Definition icalarray.c:148
void icalmemory_free_buffer(void *buf)
Releases a buffer.
Definition icalmemory.c:353
char * icalmemory_strdup(const char *s)
Creates a duplicate of a string.
Definition icalmemory.c:240
Common memory management routines.
const char * icalstrarray_element_at(icalstrarray *array, size_t position)
Accesses a string stored in the array.
size_t icalstrarray_find(icalstrarray *array, const char *needle)
Finds a string in the array.
void icalstrarray_remove(icalstrarray *array, const char *del)
Removes all occurrences of a string.
void icalstrarray_append(icalstrarray *array, const char *elem)
Appends a string to the array.
void icalstrarray_remove_element_at(icalstrarray *array, size_t position)
Removes the string at an array position.
icalstrarray * icalstrarray_clone(icalstrarray *array)
Clones the array and all its elements.
void icalstrarray_add(icalstrarray *array, const char *elem)
Appends a string to the array, omitting duplicates.
void icalstrarray_sort(icalstrarray *array)
Sorts the strings in the array in ascending order.
void icalstrarray_free(icalstrarray *array)
Frees this array's memory and all its elements.
size_t icalstrarray_size(const icalstrarray *array)
Indicates the count of strings stored in the array.
Defines the data structure for handling string arrays.
#define icalstrarray_new(increment_size)
Creates a new icalstrarray object.