/*
- * Copyright (C) 2004-2010 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2004-2010 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#include "err.h"
#include "str.h"
-/**
- * Write a message to a dynamically allocated string.
- *
- * \param fmt Usual format string.
- * \param p Result pointer.
- *
- * \sa printf(3). */
-#define VSPRINTF(fmt, p) \
-{ \
- int n; \
- size_t size = 100; \
- p = dss_malloc(size); \
- while (1) { \
- va_list ap; \
- /* Try to print in the allocated space. */ \
- va_start(ap, fmt); \
- n = vsnprintf(p, size, fmt, ap); \
- va_end(ap); \
- /* If that worked, return the string. */ \
- if (n > -1 && n < size) \
- break; \
- /* Else try again with more space. */ \
- if (n > -1) /* glibc 2.1 */ \
- size = n + 1; /* precisely what is needed */ \
- else /* glibc 2.0 */ \
- size *= 2; /* twice the old size */ \
- p = dss_realloc(p, size); \
- } \
-}
-
/**
* dss' version of realloc().
*
*/
assert(size);
if (!(p = realloc(p, size))) {
- DSS_EMERG_LOG("realloc failed (size = %zu), aborting\n",
- size);
+ DSS_EMERG_LOG(("realloc failed (size = %zu), aborting\n",
+ size));
exit(EXIT_FAILURE);
}
return p;
p = malloc(size);
if (!p) {
- DSS_EMERG_LOG("malloc failed (size = %zu), aborting\n",
- size);
+ DSS_EMERG_LOG(("malloc failed (size = %zu), aborting\n",
+ size));
exit(EXIT_FAILURE);
}
return p;
if ((ret = strdup(s? s: "")))
return ret;
- DSS_EMERG_LOG("strdup failed, aborting\n");
+ DSS_EMERG_LOG(("strdup failed, aborting\n"));
exit(EXIT_FAILURE);
}
__must_check __printf_1_2 __malloc char *make_message(const char *fmt, ...)
{
char *msg;
+ size_t size = 100;
+
+ msg = dss_malloc(size);
+ while (1) {
+ int n;
+ va_list ap;
- VSPRINTF(fmt, msg);
- return msg;
+ /* Try to print in the allocated space. */
+ va_start(ap, fmt);
+ n = vsnprintf(msg, size, fmt, ap);
+ va_end(ap);
+ /* If that worked, return the string. */
+ if (n < size)
+ return msg;
+ /* Else try again with more space. */
+ size = n + 1; /* precisely what is needed */
+ msg = dss_realloc(msg, size);
+ }
}
/**
* Get the home directory of the current user.
*
- * \return A dynammically allocated string that must be freed by the caller. If
+ * \return A dynamically allocated string that must be freed by the caller. If
* the home directory could not be found, this function returns "/tmp".
*/
__must_check __malloc char *get_homedir(void)
/**
* Get the logname of the current user.
*
- * \return A dynammically allocated string that must be freed by the caller. On
+ * \return A dynamically allocated string that must be freed by the caller. On
* errors, the string "unknown user" is returned, i.e. this function never
* returns \p NULL.
*
* \param argv_ptr Pointer to the list of substrings.
* \param delim Delimiter.
*
- * This function modifies \a args by replacing each occurance of \a delim by
+ * This function modifies \a args by replacing each occurrence of \a delim by
* zero. A \p NULL-terminated array of pointers to char* is allocated dynamically
* and these pointers are initialized to point to the broken-up substrings
* within \a args. A pointer to this array is returned via \a argv_ptr.
*/
unsigned split_args(char *args, char *** const argv_ptr, const char *delim)
{
- char *p = args;
+ char *p;
char **argv;
size_t n = 0, i, j;