diff options
| -rw-r--r-- | common/Makefile.am | 3 | ||||
| -rw-r--r-- | common/utils.c | 85 | ||||
| -rw-r--r-- | common/utils.h | 27 | 
3 files changed, 114 insertions, 1 deletions
| diff --git a/common/Makefile.am b/common/Makefile.am index 664e13b..20bfe4d 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -10,7 +10,8 @@ libinternalcommon_la_SOURCES = \  		       socket.c socket.h \  		       thread.c thread.h \  		       debug.c debug.h \ -		       userpref.c userpref.h +		       userpref.c userpref.h \ +		       utils.c utils.h  if WIN32  libinternalcommon_la_LIBADD += -lole32 diff --git a/common/utils.c b/common/utils.c new file mode 100644 index 0000000..b2b3768 --- /dev/null +++ b/common/utils.c @@ -0,0 +1,85 @@ +/* + * utils.c + * Miscellaneous utilities for string manipulation + * + * Copyright (c) 2013 Federico Mena Quintero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> + +#include "utils.h" + +/** + * Concatenate strings into a newly allocated string + * + * @note: Specify NULL for the last string in the varargs list + * + * @str: The first string in the list + * @...: Subsequent strings.  Use NULL for the last item. + * + * @return a newly allocated string, or NULL if @str is NULL.  This will also + * return NULL and set errno to ENOMEM if memory is exhausted. + */ +char *string_concat(const char *str, ...) +{ +	size_t len; +	va_list args; +	char *s; +	char *result; +	char *dest; + +	if (!str) +		return NULL; + +	/* Compute final length */ + +	len = strlen(str) + 1; /* plus 1 for the null terminator */ + +	va_start(args, str); +	s = va_arg(args, char *); +	while (s) { +		len += strlen(s); +		s = va_arg(args, char*); +	} +	va_end(args); + +	/* Concat each string */ + +	result = malloc(len); +	if (!result) +		return NULL; /* errno remains set */ + +	dest = result; + +	dest = stpcpy(dest, str); + +	va_start(args, str); +	s = va_arg(args, char *); +	while (s) { +		dest = stpcpy(dest, s); +		s = va_arg(args, char *); +	} +	va_end(args); + +	return result; +} diff --git a/common/utils.h b/common/utils.h new file mode 100644 index 0000000..129f974 --- /dev/null +++ b/common/utils.h @@ -0,0 +1,27 @@ +/* + * utils.h + * Miscellaneous utilities for string manipulation + * + * Copyright (c) 2013 Federico Mena Quintero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + */ + +#ifndef __UTILS_H +#define __UTILS_H + +char *string_concat(const char *str, ...); + +#endif | 
