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 13 char ** 14 xsplit(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 49 void 50 xfree_split_list(char **list) 51 { 52 char **p; 53 for (p = list; p && *p; p++) { 54 xfree(*p); 55 } 56 xfree(list); 57 } 58 59 char * 60 xjoin(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 }