aboutsummaryrefslogtreecommitdiffstats
path: root/src/conversion.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-09-22 10:41:55 +0000
committerWerner Koch <[email protected]>2016-09-22 10:42:10 +0000
commitdc39552d01094eff2bef5f9fcd1c16928909d20e (patch)
treeb7f5e7eaf50d578e44e218fb36d3e373831d8666 /src/conversion.c
parenttests: Add test for cancellation (diff)
downloadgpgme-dc39552d01094eff2bef5f9fcd1c16928909d20e.tar.gz
gpgme-dc39552d01094eff2bef5f9fcd1c16928909d20e.zip
core: New helper function _gpgme_strconcat.
* src/conversion.c: Include stdarg.h. (do_strconcat): New. (_gpgme_strconcat): New. * src/util.h: Provide fallback for GPGRT_ATTR_SENTINEL. (_gpgme_strconcat): New with sentinel. * src/w32-util.c (find_program_in_dir): Replace malloc and stpcpy by _gpgme_strconcat. (find_program_at_standard_place): Ditto. (_gpgme_set_default_gpg_name): Ditto. (_gpgme_set_default_gpgconf_name): Ditto. (_gpgme_mkstemp): Ditto. (_gpgme_set_override_inst_dir): Repalce malloc and strcpy by strdup. -- The function has been taken from gnupg/common/stringhelp.c and license changed to LPGLv2.1+. I am the original author of that code. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/conversion.c')
-rw-r--r--src/conversion.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/conversion.c b/src/conversion.c
index 3df8fe59..6dfabe7e 100644
--- a/src/conversion.c
+++ b/src/conversion.c
@@ -31,6 +31,7 @@
#endif
#include <time.h>
#include <errno.h>
+#include <stdarg.h>
#include "gpgme.h"
#include "util.h"
@@ -42,6 +43,61 @@
+static char *
+do_strconcat (const char *s1, va_list arg_ptr)
+{
+ const char *argv[16];
+ size_t argc;
+ size_t needed;
+ char *buffer, *p;
+
+ argc = 0;
+ argv[argc++] = s1;
+ needed = strlen (s1);
+ while (((argv[argc] = va_arg (arg_ptr, const char *))))
+ {
+ needed += strlen (argv[argc]);
+ if (argc >= DIM (argv)-1)
+ {
+ gpg_err_set_errno (EINVAL);
+ return NULL;
+ }
+ argc++;
+ }
+ needed++;
+ buffer = malloc (needed);
+ if (buffer)
+ {
+ for (p = buffer, argc=0; argv[argc]; argc++)
+ p = stpcpy (p, argv[argc]);
+ }
+ return buffer;
+}
+
+
+/* Concatenate the string S1 with all the following strings up to a
+ * NULL. Returns a malloced buffer with the new string or NULL on a
+ malloc error or if too many arguments are given. */
+char *
+_gpgme_strconcat (const char *s1, ...)
+{
+ va_list arg_ptr;
+ char *result;
+
+ if (!s1)
+ result = strdup ("");
+ else
+ {
+ va_start (arg_ptr, s1);
+ result = do_strconcat (s1, arg_ptr);
+ va_end (arg_ptr);
+ }
+ return result;
+}
+
+
+
+
/* Convert two hexadecimal digits from STR to the value they
represent. Returns -1 if one of the characters is not a
hexadecimal digit. */