mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
utils: Add utility functions guestfs___concat_strings and guestfs__join_strings.
These concatenate strings or join them with a separator in between.
(cherry picked from commit 2ee4d5e059)
This commit is contained in:
@@ -841,35 +841,6 @@ parents_of_vg (char *vg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *
|
||||
join_comma (char **strings)
|
||||
{
|
||||
size_t i, count;
|
||||
char *ret;
|
||||
|
||||
for (count = i = 0; strings[i] != NULL; ++i) {
|
||||
if (i > 0)
|
||||
count++;
|
||||
count += strlen (strings[i]);
|
||||
}
|
||||
|
||||
ret = malloc (count + 1);
|
||||
if (ret == NULL) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
for (count = i = 0; strings[i] != NULL; ++i) {
|
||||
if (i > 0)
|
||||
ret[count++] = ',';
|
||||
strcpy (&ret[count], strings[i]);
|
||||
count += strlen (strings[i]);
|
||||
}
|
||||
ret[count] = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
write_row (const char *name, const char *type,
|
||||
const char *vfs_type, const char *vfs_label, int mbr_id,
|
||||
@@ -916,7 +887,7 @@ write_row (const char *name, const char *type,
|
||||
}
|
||||
if ((columns & COLUMN_PARENTS)) {
|
||||
/* Internally comma-separated field. */
|
||||
parents_str = join_comma (parents);
|
||||
parents_str = guestfs___join_strings (",", parents);
|
||||
strings[len++] = parents_str;
|
||||
}
|
||||
if ((columns & COLUMN_UUID))
|
||||
|
||||
@@ -94,6 +94,8 @@ extern char *guestfs___safe_asprintf (guestfs_h *g, const char *fs, ...)
|
||||
/* utils.c */
|
||||
extern void guestfs___free_string_list (char **);
|
||||
extern size_t guestfs___count_strings (char *const *);
|
||||
extern char *guestfs___concat_strings (char *const *);
|
||||
extern char *guestfs___join_strings (const char *sep, char *const *);
|
||||
extern char *guestfs___exit_status_to_string (int status, const char *cmd_name, char *buffer, size_t buflen);
|
||||
extern int guestfs___random_string (char *ret, size_t len);
|
||||
extern char *guestfs___drive_name (size_t index, char *ret);
|
||||
|
||||
42
src/utils.c
42
src/utils.c
@@ -60,6 +60,48 @@ guestfs___count_strings (char *const *argv)
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Note that near-identical functions exist in the daemon. */
|
||||
char *
|
||||
guestfs___concat_strings (char *const *argv)
|
||||
{
|
||||
return guestfs___join_strings ("", argv);
|
||||
}
|
||||
|
||||
char *
|
||||
guestfs___join_strings (const char *sep, char *const *argv)
|
||||
{
|
||||
size_t i, len, seplen, rlen;
|
||||
char *r;
|
||||
|
||||
seplen = strlen (sep);
|
||||
|
||||
len = 0;
|
||||
for (i = 0; argv[i] != NULL; ++i) {
|
||||
if (i > 0)
|
||||
len += seplen;
|
||||
len += strlen (argv[i]);
|
||||
}
|
||||
len++; /* for final \0 */
|
||||
|
||||
r = malloc (len);
|
||||
if (r == NULL)
|
||||
return NULL;
|
||||
|
||||
rlen = 0;
|
||||
for (i = 0; argv[i] != NULL; ++i) {
|
||||
if (i > 0) {
|
||||
memcpy (&r[rlen], sep, seplen);
|
||||
rlen += seplen;
|
||||
}
|
||||
len = strlen (argv[i]);
|
||||
memcpy (&r[rlen], argv[i], len);
|
||||
rlen += len;
|
||||
}
|
||||
r[rlen] = '\0';
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Translate a wait/system exit status into a printable string. The
|
||||
* string must be freed by the caller.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user