1/*
2 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
3 * Use is subject to license terms.
4 */
5
6#pragma ident	"%Z%%M%	%I%	%E% SMI"
7
8#include <stdio.h>
9#include <strings.h>
10#include "xmalloc.h"
11#include "xlist.h"
12
13char **
14xsplit(char *list, char sep)
15{
16	char **a;
17	char *p, *q;
18	uint_t n = 0;
19
20	for (n = 0, p = list; p && *p; ) {
21		while (p && *p && *p == sep)
22			p++;
23		if (!*p)
24			break;
25		n++;
26		p = strchr(p, sep);
27	}
28	a = (char **)xmalloc(sizeof (char *) * (n + 2));
29	for (n = 0, p = list; p && *p; ) {
30		while (*p == sep)
31			p++;
32		if (!*p)
33			break;
34		q = strchr(p, sep);
35		if (!q)
36			q = p + strlen(p);
37		a[n] = (char *)xmalloc((q - p + 2));
38		(void) strncpy(a[n], p, q - p);
39		a[n][q - p] = '\0';
40		n++;
41		if (!*q)
42			break;
43		p = q + 1;
44	}
45	a[n] = NULL;
46	return (a);
47}
48
49void
50xfree_split_list(char **list)
51{
52	char **p;
53	for (p = list; p && *p; p++) {
54		xfree(*p);
55	}
56	xfree(list);
57}
58
59char *
60xjoin(char **alist, char sep)
61{
62	char **p;
63	char *list;
64	char sep_str[2];
65	uint_t n;
66
67	for (n = 1, p = alist; p && *p; p++) {
68		if (!*p || !**p)
69			continue;
70		n += strlen(*p) + 1;
71	}
72	list = (char *)xmalloc(n);
73	*list = '\0';
74
75	sep_str[0] = sep;
76	sep_str[1] = '\0';
77	for (p = alist; p && *p; p++) {
78		if (!*p || !**p)
79			continue;
80		if (*list != '\0')
81			(void) strlcat(list, sep_str, n);
82		(void) strlcat(list, *p, n);
83	}
84	return (list);
85}
86