$darkmode
Libical API Documentation 4.0 STABLE VERSION Visit the v3.0 documentation
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 
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 
24 size_t icalstrarray_size(const icalstrarray *array)
25 {
26  if (!array) {
27  return 0;
28  }
29  return array->num_elements;
30 }
31 
32 const 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 
40 size_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 
59 void 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 
71 void 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 
82 void 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 
96 void 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 {
109  icalmemory_free_buffer(*elem);
110  }
111  }
112 
113  array->num_elements = j;
114 }
115 
116 void 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 
132 static int strpcmp(const char **a, const char **b)
133 {
134  return strcmp(*a, *b);
135 }
136 
137 void icalstrarray_sort(icalstrarray *array)
138 {
139  if (!array) {
140  return;
141  }
142  icalarray_sort(array, (int (*)(const void *, const void *))&strpcmp);
143 }
144 
145 icalstrarray *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 }
size_t icalstrarray_size(const icalstrarray *array)
Indicates the count of strings stored in the array.
Definition: icalstrarray.c:24
#define icalstrarray_new(increment_size)
Creates a new icalstrarray object.
Definition: icalstrarray.h:47
void icalarray_free(icalarray *array)
Definition: icalarray.c:104
Common memory management routines.
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
char * icalmemory_strdup(const char *s)
Creates a duplicate of a string.
Definition: icalmemory.c:242
void icalmemory_free_buffer(void *buf)
Releases a buffer.
Definition: icalmemory.c:355
const char * icalstrarray_element_at(icalstrarray *array, size_t position)
Accesses a string stored in the array.
Definition: icalstrarray.c:32
void icalstrarray_sort(icalstrarray *array)
Sorts the strings in the array in ascending order.
Definition: icalstrarray.c:137
void icalstrarray_free(icalstrarray *array)
Frees this array's memory and all its elements.
Definition: icalstrarray.c:116
void icalstrarray_remove_element_at(icalstrarray *array, size_t position)
Removes the string at an array position.
Definition: icalstrarray.c:82
void icalarray_append(icalarray *array, const void *element)
Appends an element to an array.
Definition: icalarray.c:119
void icalstrarray_add(icalstrarray *array, const char *elem)
Appends a string to the array, omitting duplicates.
Definition: icalstrarray.c:71
void * icalarray_element_at(icalarray *array, size_t position)
Access an array element.
Definition: icalarray.c:135
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 icalstrarray_append(icalstrarray *array, const char *elem)
Appends a string to the array.
Definition: icalstrarray.c:59
void icalarray_remove_element_at(icalarray *array, size_t position)
Removes a given element from an array.
Definition: icalarray.c:148
icalstrarray * icalstrarray_clone(icalstrarray *array)
Clones the array and all its elements.
Definition: icalstrarray.c:145
Defines the data structure for handling string arrays.
void icalstrarray_remove(icalstrarray *array, const char *del)
Removes all occurrences of a string.
Definition: icalstrarray.c:96
size_t icalstrarray_find(icalstrarray *array, const char *needle)
Finds a string in the array.
Definition: icalstrarray.c:40