2 Copyright (C) 2012-2024 Ben Kibbey <bjk@luxsci.net>
4 This file is part of libpwmd.
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License version 2.1 as published by the Free Software Foundation.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
29 #include "util-string.h"
32 string_free (struct string_s
*s
, int with_data
)
44 string_erase (struct string_s
*s
, ssize_t pos
, ssize_t len
)
52 s
->len
= s
->len
- pos
;
58 memmove (&s
->str
[pos
], &s
->str
[pos
+ len
], n
);
64 /* Be careful about allocations since other string_ functions may
65 * realloc the 'str' pointer. */
67 string_new_content (char *str
)
69 struct string_s
*s
= pwmd_calloc (1, sizeof (struct string_s
));
72 s
->len
= strlen (s
->str
);
73 s
->allocated
= s
->len
+ 1;
78 string_new (const char *str
)
80 struct string_s
*s
= pwmd_calloc (1, sizeof (struct string_s
));
84 s
->str
= str_dup (str
);
91 s
->len
= strlen (s
->str
);
92 s
->allocated
= s
->len
+ 1;
99 string_append (struct string_s
*s
, const char *str
)
101 size_t len
= strlen (str
);
103 if (s
->allocated
< len
+ s
->len
+ 1)
105 char *p
= pwmd_realloc (s
->str
, (len
+ s
->len
+ 1) * sizeof (char));
111 s
->allocated
= s
->len
+ len
+ 1;
114 memcpy (&s
->str
[s
->len
], str
, len
);
121 string_truncate (struct string_s
*s
, size_t n
)
135 string_prepend (struct string_s
*s
, const char *str
)
137 size_t len
= strlen (str
);
139 if (s
->allocated
< s
->len
+ len
+ 1)
141 char *p
= pwmd_realloc (s
->str
, (len
+ s
->len
+ 1) * sizeof (char));
147 s
->allocated
= s
->len
+ len
+ 1;
150 memmove (&s
->str
[len
], s
->str
, s
->len
);
151 memcpy (s
->str
, str
, len
);
158 string_append_printf (struct string_s
*s
, const char *fmt
, ...)
165 len
= str_vasprintf (&buf
, fmt
, ap
);
171 s
= string_append (s
, buf
);
177 string_insert_c (struct string_s
*s
, ssize_t pos
, char c
)
179 size_t len
= s
->len
+ 2;
181 if (pos
>= s
->allocated
)
184 if (s
->allocated
< len
)
186 char *p
= pwmd_realloc (s
->str
, len
* sizeof (char));
195 memmove (&s
->str
[pos
+ 1], &s
->str
[pos
], s
->len
- pos
);
197 s
->len
= pos
+ 1 == s
->allocated
? pos
+ 1 : s
->len
+ 1;
203 strv_length (char **a
)
213 /* 'str' must already be allocated. */
215 strv_cat (char **a
, char *str
)
217 int len
= a
? strv_length (a
) : 0;
220 dst
= pwmd_realloc (a
, (len
+ 2) * sizeof (char *));
230 strv_printf (char ***array
, const char *fmt
, ...)
238 ret
= str_vasprintf (&buf
, fmt
, ap
);
244 a
= strv_cat (*array
, buf
);
260 for (p
= a
; p
&& *p
; p
++)
267 strv_dup (char **src
)
272 for (p
= src
; p
&& *p
; p
++)
275 char *xp
= str_dup (*p
);
283 tmp
= strv_cat (dst
, xp
);
298 strv_catv (char **dst
, char **src
)
310 for (p
= src
; p
&& *p
; p
++)
313 char *xp
= str_dup (*p
);
321 tmp
= strv_cat (d
, xp
);
338 size_t len
= strlen (str
);
341 while (isspace (str
[--len
]))
351 str_split_common (const char *src
, const char *delim
, int count
, int ws
)
355 const char *dp
= delim
;
356 char *str
= str_dup (src
);
358 size_t dlen
= strlen (delim
);
359 size_t pos
= 0, lastpos
= 0;
375 size_t len
= pos
- lastpos
- dlen
+ 1;
378 xp
= pwmd_malloc (len
+ 1);
386 memcpy (xp
, &str
[lastpos
], len
);
393 tmp
= strv_cat (dst
, s
);
405 if (count
> 0 && index
+1 == count
&& *(p
+ 1))
407 if (!strv_printf (&dst
, "%s", p
+ 1))
433 if (!strv_printf (&dst
, "%s", p
))
444 /* Like str_split() but trims whitespace between 'delim'. */
446 str_split_ws (const char *str
, const char *delim
, int count
)
448 return str_split_common (str
, delim
, count
, 1);
452 str_split (const char *str
, const char *delim
, int count
)
454 return str_split_common (str
, delim
, count
, 0);
458 strv_join (char *delim
, char **a
)
462 struct string_s
*s
= string_new ("");
471 sp
= string_append_printf (s
, "%s%s", *p
, delim
472 && *(p
+ 1) ? delim
: "");
492 for (p
= str
; *p
; p
++)
502 str_chomp (char *str
)
504 int len
= strlen (str
);
505 char *p
= str
+ len
- 1;
507 while (len
&& isspace (*p
))
520 memmove (str
, p
, len
);
526 str_dup (const char *str
)
533 t
= pwmd_malloc ((len
+ 1) * sizeof (char));
537 for (c
= 0; c
< len
; c
++)
545 str_asprintf (const char *fmt
, ...)
552 len
= str_vasprintf (&result
, fmt
, ap
);
554 return len
== -1 ? NULL
: result
;
558 str_vasprintf (char **result
, const char *fmt
, va_list ap
)
565 len
= vsnprintf (NULL
, 0, fmt
, cp
);
568 buf
= pwmd_malloc (++len
);
573 len2
= vsnprintf (buf
, len
, fmt
, cp
);