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:
Richard W.M. Jones
2013-06-18 15:12:02 +01:00
parent 2042024e57
commit 1b74ffcf88
3 changed files with 45 additions and 30 deletions

View File

@@ -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))

View File

@@ -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);

View File

@@ -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.
*/