From 94d42b3df7891066f630b2c979f79f79e2bded33 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Mon, 30 May 2016 22:28:02 +0200 Subject: [PATCH] Add compat strdupa() implementation from libnostd This patch adds compat support, to *BSD and other UNIX, for GLIBC strdupa() function, used in mkpath(). The implementation is taken from http://www.25thandclement.com/~william/projects/libnostd.html by William Ahern. Signed-off-by: Joachim Nilsson --- strdupa.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ strlite.h | 1 + 2 files changed, 55 insertions(+) create mode 100644 strdupa.h diff --git a/strdupa.h b/strdupa.h new file mode 100644 index 0000000..aadc607 --- /dev/null +++ b/strdupa.h @@ -0,0 +1,54 @@ +/* ========================================================================== + * strdupa.h - Re-implementation of glibc strdupa. + * -------------------------------------------------------------------------- + * Copyright (c) 2009 William Ahern + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the + * following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * ========================================================================== + */ +#ifndef GNU_STRING_STRDUPA_H +#define GNU_STRING_STRDUPA_H + + +#if !defined(HAVE_STRDUPA) +#if defined(strdupa) +#define HAVE_STRDUPA 1 +#endif +#endif + + +#if !HAVE_STRDUPA +#if defined(__GNUC__) +#include /* size_t */ + +#include /* memcpy(3) strlen(3) */ + +#define strdupa(src) (__extension__ ({ \ + size_t len_ = strlen(src); \ + char *dst_ = __builtin_alloca(len_ + 1); \ + dst_[len_] = '\0'; \ + (char *)memcpy(dst_, src, len_); \ +})) + +#endif /* __GNUC__ */ +#endif /* !HAVE_STRDUPA */ + + +#endif /* GNU_STRING_STRDUPA_H */ diff --git a/strlite.h b/strlite.h index 782f8e5..89f89f5 100644 --- a/strlite.h +++ b/strlite.h @@ -25,6 +25,7 @@ #define LITE_STRING_H_ #include +#include "strdupa.h" #ifndef strlcpy size_t strlcpy (char *dst, const char *src, size_t siz);