aboutsummaryrefslogtreecommitdiffstats
path: root/src/init.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2017-11-17 10:26:03 +0000
committerWerner Koch <[email protected]>2017-11-17 10:26:03 +0000
commit0d8d46c76a32176be440b062d2501bbb044fb99d (patch)
tree7033aa06cf73e40bd8360a8058262bd61d9c0d4f /src/init.c
parentcore: New API functions gpgrt_malloc, gpgrt_calloc, and gpgrt_realloc. (diff)
downloadlibgpg-error-0d8d46c76a32176be440b062d2501bbb044fb99d.tar.gz
libgpg-error-0d8d46c76a32176be440b062d2501bbb044fb99d.zip
core: New API functions gpgrt_strdup and gpgrt_strconcat.
* src/visibility.c (gpgrt_strdup): New API fucntion. (gpgrt_strconcat): New API fucntion. * src/visibility.h: Add corresponding macros. * src/gpg-error.def.in: Add them. * src/gpg-error.vers: Add them. * src/gpgrt-int.h (DIM): New macro. * src/init.c (_gpgrt_strdup): New. (_gpgrt_strconcat_core): New. (_gpgrt_strconcat): New. -- Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/init.c')
-rw-r--r--src/init.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/init.c b/src/init.c
index 0154091..89475d3 100644
--- a/src/init.c
+++ b/src/init.c
@@ -215,6 +215,70 @@ _gpgrt_calloc (size_t n, size_t m)
}
+char *
+_gpgrt_strdup (const char *string)
+{
+ size_t len = strlen (string);
+ char *p;
+
+ p = _gpgrt_realloc (NULL, len + 1);
+ if (p)
+ strcpy (p, string);
+ return p;
+}
+
+
+/* Helper for _gpgrt_stdconcat and gpgrt_strconcat. */
+char *
+_gpgrt_strconcat_core (const char *s1, va_list arg_ptr)
+{
+ const char *argv[48];
+ 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 = _gpgrt_malloc (needed);
+ if (buffer)
+ {
+ for (p = buffer, argc=0; argv[argc]; argc++)
+ p = stpcpy (p, argv[argc]);
+ }
+ return buffer;
+}
+
+
+char *
+_gpgrt_strconcat (const char *s1, ...)
+{
+ va_list arg_ptr;
+ char *result;
+
+ if (!s1)
+ result = _gpgrt_strdup ("");
+ else
+ {
+ va_start (arg_ptr, s1);
+ result = _gpgrt_strconcat_core (s1, arg_ptr);
+ va_end (arg_ptr);
+ }
+ return result;
+}
+
+
/* The free to be used for data returned by the public API. */
void
_gpgrt_free (void *a)