74 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
| /* SPDX-License-Identifier: MIT OR X11
 | |
|  *
 | |
|  * Copyright © 1987, 1998  The Open Group
 | |
|  * Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
 | |
|  */
 | |
| #include <dix-config.h>
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| #include "os.h"
 | |
| 
 | |
| char *
 | |
| Xstrdup(const char *s)
 | |
| {
 | |
|     if (s == NULL)
 | |
|         return NULL;
 | |
|     return strdup(s);
 | |
| }
 | |
| 
 | |
| char *
 | |
| XNFstrdup(const char *s)
 | |
| {
 | |
|     char *ret;
 | |
| 
 | |
|     if (s == NULL)
 | |
|         return NULL;
 | |
| 
 | |
|     ret = strdup(s);
 | |
|     if (!ret)
 | |
|         FatalError("XNFstrdup: Out of memory");
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Tokenize a string into a NULL terminated array of strings. Always returns
 | |
|  * an allocated array unless an error occurs.
 | |
|  */
 | |
| char **
 | |
| xstrtokenize(const char *str, const char *separators)
 | |
| {
 | |
|     char **list, **nlist;
 | |
|     char *tok, *tmp;
 | |
|     unsigned num = 0, n;
 | |
| 
 | |
|     if (!str)
 | |
|         return NULL;
 | |
|     list = calloc(1, sizeof(*list));
 | |
|     if (!list)
 | |
|         return NULL;
 | |
|     tmp = strdup(str);
 | |
|     if (!tmp)
 | |
|         goto error;
 | |
|     for (tok = strtok(tmp, separators); tok; tok = strtok(NULL, separators)) {
 | |
|         nlist = reallocarray(list, num + 2, sizeof(*list));
 | |
|         if (!nlist)
 | |
|             goto error;
 | |
|         list = nlist;
 | |
|         list[num] = strdup(tok);
 | |
|         if (!list[num])
 | |
|             goto error;
 | |
|         list[++num] = NULL;
 | |
|     }
 | |
|     free(tmp);
 | |
|     return list;
 | |
| 
 | |
|  error:
 | |
|     free(tmp);
 | |
|     for (n = 0; n < num; n++)
 | |
|         free(list[n]);
 | |
|     free(list);
 | |
|     return NULL;
 | |
| }
 |